Bladeren bron

feat(core): CustomField support on Country, CustomerGroup, PaymentMethod, Promotion, TaxCategory,

...TaxRate & Zone. Relates to #1185
Michael Bromley 4 jaren geleden
bovenliggende
commit
fac803d1ee
24 gewijzigde bestanden met toevoegingen van 316 en 41 verwijderingen
  1. 30 1
      packages/admin-ui/src/lib/core/src/common/generated-types.ts
  2. 30 1
      packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts
  3. 6 0
      packages/common/src/generated-shop-types.ts
  4. 30 1
      packages/common/src/generated-types.ts
  5. 30 1
      packages/core/e2e/graphql/generated-e2e-admin-types.ts
  6. 6 0
      packages/core/e2e/graphql/generated-e2e-shop-types.ts
  7. 11 4
      packages/core/src/config/custom-field/custom-field-types.ts
  8. 8 1
      packages/core/src/config/default-config.ts
  9. 6 1
      packages/core/src/entity/country/country-translation.entity.ts
  10. 6 1
      packages/core/src/entity/country/country.entity.ts
  11. 15 7
      packages/core/src/entity/custom-entity-fields.ts
  12. 7 2
      packages/core/src/entity/customer-group/customer-group.entity.ts
  13. 6 1
      packages/core/src/entity/payment-method/payment-method.entity.ts
  14. 6 1
      packages/core/src/entity/promotion/promotion.entity.ts
  15. 18 4
      packages/core/src/entity/register-custom-entity-fields.ts
  16. 6 1
      packages/core/src/entity/tax-category/tax-category.entity.ts
  17. 6 1
      packages/core/src/entity/tax-rate/tax-rate.entity.ts
  18. 6 1
      packages/core/src/entity/zone/zone.entity.ts
  19. 9 2
      packages/dev-server/dev-config.ts
  20. 30 1
      packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts
  21. 34 5
      packages/payment-plugin/e2e/graphql/generated-admin-types.ts
  22. 10 4
      packages/payment-plugin/e2e/graphql/generated-shop-types.ts
  23. 0 0
      schema-admin.json
  24. 0 0
      schema-shop.json

+ 30 - 1
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -491,6 +491,7 @@ export type Country = Node & {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
   translations: Array<CountryTranslation>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -542,6 +543,7 @@ export type CountryTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -611,11 +613,13 @@ export type CreateCountryInput = {
   code: Scalars['String'];
   translations: Array<CountryTranslationInput>;
   enabled: Scalars['Boolean'];
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
   name: Scalars['String'];
   customerIds?: Maybe<Array<Scalars['ID']>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -669,6 +673,7 @@ export type CreatePaymentMethodInput = {
   enabled: Scalars['Boolean'];
   checker?: Maybe<ConfigurableOperationInput>;
   handler: ConfigurableOperationInput;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -726,6 +731,7 @@ export type CreatePromotionInput = {
   perCustomerUsageLimit?: Maybe<Scalars['Int']>;
   conditions: Array<ConfigurableOperationInput>;
   actions: Array<ConfigurableOperationInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -753,6 +759,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
   name: Scalars['String'];
   isDefault?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -762,11 +769,13 @@ export type CreateTaxRateInput = {
   categoryId: Scalars['ID'];
   zoneId: Scalars['ID'];
   customerGroupId?: Maybe<Scalars['ID']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
   name: Scalars['String'];
   memberIds?: Maybe<Array<Scalars['ID']>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1134,19 +1143,26 @@ export type CustomFields = {
   Asset: Array<CustomFieldConfig>;
   Channel: Array<CustomFieldConfig>;
   Collection: Array<CustomFieldConfig>;
+  Country: Array<CustomFieldConfig>;
   Customer: Array<CustomFieldConfig>;
+  CustomerGroup: Array<CustomFieldConfig>;
   Facet: Array<CustomFieldConfig>;
   FacetValue: Array<CustomFieldConfig>;
   Fulfillment: Array<CustomFieldConfig>;
   GlobalSettings: Array<CustomFieldConfig>;
   Order: Array<CustomFieldConfig>;
   OrderLine: Array<CustomFieldConfig>;
+  PaymentMethod: Array<CustomFieldConfig>;
   Product: Array<CustomFieldConfig>;
   ProductOption: Array<CustomFieldConfig>;
   ProductOptionGroup: Array<CustomFieldConfig>;
   ProductVariant: Array<CustomFieldConfig>;
-  User: Array<CustomFieldConfig>;
+  Promotion: Array<CustomFieldConfig>;
   ShippingMethod: Array<CustomFieldConfig>;
+  TaxCategory: Array<CustomFieldConfig>;
+  TaxRate: Array<CustomFieldConfig>;
+  User: Array<CustomFieldConfig>;
+  Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1194,6 +1210,7 @@ export type CustomerGroup = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   customers: CustomerList;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3386,6 +3403,7 @@ export type PaymentMethod = Node & {
   enabled: Scalars['Boolean'];
   checker?: Maybe<ConfigurableOperation>;
   handler: ConfigurableOperation;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3929,6 +3947,7 @@ export type Promotion = Node & {
   enabled: Scalars['Boolean'];
   conditions: Array<ConfigurableOperation>;
   actions: Array<ConfigurableOperation>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4785,6 +4804,7 @@ export type TaxCategory = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   isDefault: Scalars['Boolean'];
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4804,6 +4824,7 @@ export type TaxRate = Node & {
   category: TaxCategory;
   zone: Zone;
   customerGroup?: Maybe<CustomerGroup>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4977,11 +4998,13 @@ export type UpdateCountryInput = {
   code?: Maybe<Scalars['String']>;
   translations?: Maybe<Array<CountryTranslationInput>>;
   enabled?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -5056,6 +5079,7 @@ export type UpdatePaymentMethodInput = {
   enabled?: Maybe<Scalars['Boolean']>;
   checker?: Maybe<ConfigurableOperationInput>;
   handler?: Maybe<ConfigurableOperationInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -5109,6 +5133,7 @@ export type UpdatePromotionInput = {
   perCustomerUsageLimit?: Maybe<Scalars['Int']>;
   conditions?: Maybe<Array<ConfigurableOperationInput>>;
   actions?: Maybe<Array<ConfigurableOperationInput>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -5140,6 +5165,7 @@ export type UpdateTaxCategoryInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
   isDefault?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -5150,11 +5176,13 @@ export type UpdateTaxRateInput = {
   categoryId?: Maybe<Scalars['ID']>;
   zoneId?: Maybe<Scalars['ID']>;
   customerGroupId?: Maybe<Scalars['ID']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -5195,6 +5223,7 @@ export type Zone = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   members: Array<Country>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type RoleFragment = (

+ 30 - 1
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -479,6 +479,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -528,6 +529,7 @@ export type CountryTranslationInput = {
     id?: Maybe<Scalars['ID']>;
     languageCode: LanguageCode;
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -597,11 +599,13 @@ export type CreateCountryInput = {
     code: Scalars['String'];
     translations: Array<CountryTranslationInput>;
     enabled: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
     name: Scalars['String'];
     customerIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -654,6 +658,7 @@ export type CreatePaymentMethodInput = {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperationInput>;
     handler: ConfigurableOperationInput;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -711,6 +716,7 @@ export type CreatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions: Array<ConfigurableOperationInput>;
     actions: Array<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -738,6 +744,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
     name: Scalars['String'];
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -747,11 +754,13 @@ export type CreateTaxRateInput = {
     categoryId: Scalars['ID'];
     zoneId: Scalars['ID'];
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
     name: Scalars['String'];
     memberIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1117,19 +1126,26 @@ export type CustomFields = {
     Asset: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
+    Country: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
+    CustomerGroup: Array<CustomFieldConfig>;
     Facet: Array<CustomFieldConfig>;
     FacetValue: Array<CustomFieldConfig>;
     Fulfillment: Array<CustomFieldConfig>;
     GlobalSettings: Array<CustomFieldConfig>;
     Order: Array<CustomFieldConfig>;
     OrderLine: Array<CustomFieldConfig>;
+    PaymentMethod: Array<CustomFieldConfig>;
     Product: Array<CustomFieldConfig>;
     ProductOption: Array<CustomFieldConfig>;
     ProductOptionGroup: Array<CustomFieldConfig>;
     ProductVariant: Array<CustomFieldConfig>;
-    User: Array<CustomFieldConfig>;
+    Promotion: Array<CustomFieldConfig>;
     ShippingMethod: Array<CustomFieldConfig>;
+    TaxCategory: Array<CustomFieldConfig>;
+    TaxRate: Array<CustomFieldConfig>;
+    User: Array<CustomFieldConfig>;
+    Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1173,6 +1189,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -3165,6 +3182,7 @@ export type PaymentMethod = Node & {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperation>;
     handler: ConfigurableOperation;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3686,6 +3704,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4478,6 +4497,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4495,6 +4515,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4657,11 +4678,13 @@ export type UpdateCountryInput = {
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<CountryTranslationInput>>;
     enabled?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -4736,6 +4759,7 @@ export type UpdatePaymentMethodInput = {
     enabled?: Maybe<Scalars['Boolean']>;
     checker?: Maybe<ConfigurableOperationInput>;
     handler?: Maybe<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -4789,6 +4813,7 @@ export type UpdatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions?: Maybe<Array<ConfigurableOperationInput>>;
     actions?: Maybe<Array<ConfigurableOperationInput>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -4820,6 +4845,7 @@ export type UpdateTaxCategoryInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -4830,11 +4856,13 @@ export type UpdateTaxRateInput = {
     categoryId?: Maybe<Scalars['ID']>;
     zoneId?: Maybe<Scalars['ID']>;
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type User = Node & {
@@ -4855,6 +4883,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAssetsMutationVariables = Exact<{

+ 6 - 0
packages/common/src/generated-shop-types.ts

@@ -298,6 +298,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryList = PaginatedList & {
@@ -760,6 +761,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -2536,6 +2538,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionList = PaginatedList & {
@@ -2920,6 +2923,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -2939,6 +2943,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateList = PaginatedList & {
@@ -3052,4 +3057,5 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };

+ 30 - 1
packages/common/src/generated-types.ts

@@ -490,6 +490,7 @@ export type Country = Node & {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
   translations: Array<CountryTranslation>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -541,6 +542,7 @@ export type CountryTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -610,11 +612,13 @@ export type CreateCountryInput = {
   code: Scalars['String'];
   translations: Array<CountryTranslationInput>;
   enabled: Scalars['Boolean'];
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
   name: Scalars['String'];
   customerIds?: Maybe<Array<Scalars['ID']>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -668,6 +672,7 @@ export type CreatePaymentMethodInput = {
   enabled: Scalars['Boolean'];
   checker?: Maybe<ConfigurableOperationInput>;
   handler: ConfigurableOperationInput;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -725,6 +730,7 @@ export type CreatePromotionInput = {
   perCustomerUsageLimit?: Maybe<Scalars['Int']>;
   conditions: Array<ConfigurableOperationInput>;
   actions: Array<ConfigurableOperationInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -752,6 +758,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
   name: Scalars['String'];
   isDefault?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -761,11 +768,13 @@ export type CreateTaxRateInput = {
   categoryId: Scalars['ID'];
   zoneId: Scalars['ID'];
   customerGroupId?: Maybe<Scalars['ID']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
   name: Scalars['String'];
   memberIds?: Maybe<Array<Scalars['ID']>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1126,19 +1135,26 @@ export type CustomFields = {
   Asset: Array<CustomFieldConfig>;
   Channel: Array<CustomFieldConfig>;
   Collection: Array<CustomFieldConfig>;
+  Country: Array<CustomFieldConfig>;
   Customer: Array<CustomFieldConfig>;
+  CustomerGroup: Array<CustomFieldConfig>;
   Facet: Array<CustomFieldConfig>;
   FacetValue: Array<CustomFieldConfig>;
   Fulfillment: Array<CustomFieldConfig>;
   GlobalSettings: Array<CustomFieldConfig>;
   Order: Array<CustomFieldConfig>;
   OrderLine: Array<CustomFieldConfig>;
+  PaymentMethod: Array<CustomFieldConfig>;
   Product: Array<CustomFieldConfig>;
   ProductOption: Array<CustomFieldConfig>;
   ProductOptionGroup: Array<CustomFieldConfig>;
   ProductVariant: Array<CustomFieldConfig>;
-  User: Array<CustomFieldConfig>;
+  Promotion: Array<CustomFieldConfig>;
   ShippingMethod: Array<CustomFieldConfig>;
+  TaxCategory: Array<CustomFieldConfig>;
+  TaxRate: Array<CustomFieldConfig>;
+  User: Array<CustomFieldConfig>;
+  Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1186,6 +1202,7 @@ export type CustomerGroup = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   customers: CustomerList;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3334,6 +3351,7 @@ export type PaymentMethod = Node & {
   enabled: Scalars['Boolean'];
   checker?: Maybe<ConfigurableOperation>;
   handler: ConfigurableOperation;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3876,6 +3894,7 @@ export type Promotion = Node & {
   enabled: Scalars['Boolean'];
   conditions: Array<ConfigurableOperation>;
   actions: Array<ConfigurableOperation>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4729,6 +4748,7 @@ export type TaxCategory = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   isDefault: Scalars['Boolean'];
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4748,6 +4768,7 @@ export type TaxRate = Node & {
   category: TaxCategory;
   zone: Zone;
   customerGroup?: Maybe<CustomerGroup>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4914,11 +4935,13 @@ export type UpdateCountryInput = {
   code?: Maybe<Scalars['String']>;
   translations?: Maybe<Array<CountryTranslationInput>>;
   enabled?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -4993,6 +5016,7 @@ export type UpdatePaymentMethodInput = {
   enabled?: Maybe<Scalars['Boolean']>;
   checker?: Maybe<ConfigurableOperationInput>;
   handler?: Maybe<ConfigurableOperationInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -5046,6 +5070,7 @@ export type UpdatePromotionInput = {
   perCustomerUsageLimit?: Maybe<Scalars['Int']>;
   conditions?: Maybe<Array<ConfigurableOperationInput>>;
   actions?: Maybe<Array<ConfigurableOperationInput>>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -5077,6 +5102,7 @@ export type UpdateTaxCategoryInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
   isDefault?: Maybe<Scalars['Boolean']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -5087,11 +5113,13 @@ export type UpdateTaxRateInput = {
   categoryId?: Maybe<Scalars['ID']>;
   zoneId?: Maybe<Scalars['ID']>;
   customerGroupId?: Maybe<Scalars['ID']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
   id: Scalars['ID'];
   name?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -5115,4 +5143,5 @@ export type Zone = Node & {
   updatedAt: Scalars['DateTime'];
   name: Scalars['String'];
   members: Array<Country>;
+  customFields?: Maybe<Scalars['JSON']>;
 };

+ 30 - 1
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -479,6 +479,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -528,6 +529,7 @@ export type CountryTranslationInput = {
     id?: Maybe<Scalars['ID']>;
     languageCode: LanguageCode;
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -597,11 +599,13 @@ export type CreateCountryInput = {
     code: Scalars['String'];
     translations: Array<CountryTranslationInput>;
     enabled: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
     name: Scalars['String'];
     customerIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -654,6 +658,7 @@ export type CreatePaymentMethodInput = {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperationInput>;
     handler: ConfigurableOperationInput;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -711,6 +716,7 @@ export type CreatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions: Array<ConfigurableOperationInput>;
     actions: Array<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -738,6 +744,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
     name: Scalars['String'];
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -747,11 +754,13 @@ export type CreateTaxRateInput = {
     categoryId: Scalars['ID'];
     zoneId: Scalars['ID'];
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
     name: Scalars['String'];
     memberIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1117,19 +1126,26 @@ export type CustomFields = {
     Asset: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
+    Country: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
+    CustomerGroup: Array<CustomFieldConfig>;
     Facet: Array<CustomFieldConfig>;
     FacetValue: Array<CustomFieldConfig>;
     Fulfillment: Array<CustomFieldConfig>;
     GlobalSettings: Array<CustomFieldConfig>;
     Order: Array<CustomFieldConfig>;
     OrderLine: Array<CustomFieldConfig>;
+    PaymentMethod: Array<CustomFieldConfig>;
     Product: Array<CustomFieldConfig>;
     ProductOption: Array<CustomFieldConfig>;
     ProductOptionGroup: Array<CustomFieldConfig>;
     ProductVariant: Array<CustomFieldConfig>;
-    User: Array<CustomFieldConfig>;
+    Promotion: Array<CustomFieldConfig>;
     ShippingMethod: Array<CustomFieldConfig>;
+    TaxCategory: Array<CustomFieldConfig>;
+    TaxRate: Array<CustomFieldConfig>;
+    User: Array<CustomFieldConfig>;
+    Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1173,6 +1189,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -3165,6 +3182,7 @@ export type PaymentMethod = Node & {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperation>;
     handler: ConfigurableOperation;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3686,6 +3704,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4478,6 +4497,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4495,6 +4515,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4657,11 +4678,13 @@ export type UpdateCountryInput = {
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<CountryTranslationInput>>;
     enabled?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -4736,6 +4759,7 @@ export type UpdatePaymentMethodInput = {
     enabled?: Maybe<Scalars['Boolean']>;
     checker?: Maybe<ConfigurableOperationInput>;
     handler?: Maybe<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -4789,6 +4813,7 @@ export type UpdatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions?: Maybe<Array<ConfigurableOperationInput>>;
     actions?: Maybe<Array<ConfigurableOperationInput>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -4820,6 +4845,7 @@ export type UpdateTaxCategoryInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -4830,11 +4856,13 @@ export type UpdateTaxRateInput = {
     categoryId?: Maybe<Scalars['ID']>;
     zoneId?: Maybe<Scalars['ID']>;
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type User = Node & {
@@ -4855,6 +4883,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type GetAdministratorsQueryVariables = Exact<{

+ 6 - 0
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -279,6 +279,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryList = PaginatedList & {
@@ -732,6 +733,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -2449,6 +2451,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionList = PaginatedList & {
@@ -2810,6 +2813,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -2827,6 +2831,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateList = PaginatedList & {
@@ -2934,6 +2939,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TestOrderFragmentFragment = Pick<

+ 11 - 4
packages/core/src/config/custom-field/custom-field-types.ts

@@ -45,7 +45,7 @@ export type BaseTypedCustomFieldConfig<T extends CustomFieldType, C extends Cust
  */
 export type TypedCustomSingleFieldConfig<
     T extends CustomFieldType,
-    C extends CustomField
+    C extends CustomField,
 > = BaseTypedCustomFieldConfig<T, C> & {
     list?: false;
     defaultValue?: DefaultValueType<T>;
@@ -57,7 +57,7 @@ export type TypedCustomSingleFieldConfig<
 
 export type TypedCustomListFieldConfig<
     T extends CustomFieldType,
-    C extends CustomField
+    C extends CustomField,
 > = BaseTypedCustomFieldConfig<T, C> & {
     list?: true;
     defaultValue?: Array<DefaultValueType<T>>;
@@ -66,7 +66,7 @@ export type TypedCustomListFieldConfig<
 
 export type TypedCustomFieldConfig<
     T extends CustomFieldType,
-    C extends CustomField
+    C extends CustomField,
 > = BaseTypedCustomFieldConfig<T, C> &
     (TypedCustomSingleFieldConfig<T, C> | TypedCustomListFieldConfig<T, C>);
 
@@ -192,19 +192,26 @@ export interface CustomFields {
     Asset?: CustomFieldConfig[];
     Channel?: CustomFieldConfig[];
     Collection?: CustomFieldConfig[];
+    Country?: CustomFieldConfig[];
     Customer?: CustomFieldConfig[];
+    CustomerGroup?: CustomFieldConfig[];
     Facet?: CustomFieldConfig[];
     FacetValue?: CustomFieldConfig[];
     Fulfillment?: CustomFieldConfig[];
     GlobalSettings?: CustomFieldConfig[];
     Order?: CustomFieldConfig[];
     OrderLine?: CustomFieldConfig[];
+    PaymentMethod?: CustomFieldConfig[];
     Product?: CustomFieldConfig[];
     ProductOption?: CustomFieldConfig[];
     ProductOptionGroup?: CustomFieldConfig[];
     ProductVariant?: CustomFieldConfig[];
-    User?: CustomFieldConfig[];
+    Promotion?: CustomFieldConfig[];
     ShippingMethod?: CustomFieldConfig[];
+    TaxCategory?: CustomFieldConfig[];
+    TaxRate?: CustomFieldConfig[];
+    User?: CustomFieldConfig[];
+    Zone?: CustomFieldConfig[];
 }
 
 /**

+ 8 - 1
packages/core/src/config/default-config.ts

@@ -156,19 +156,26 @@ export const defaultConfig: RuntimeVendureConfig = {
         Asset: [],
         Channel: [],
         Collection: [],
+        Country: [],
         Customer: [],
+        CustomerGroup: [],
         Facet: [],
         FacetValue: [],
         Fulfillment: [],
         GlobalSettings: [],
         Order: [],
         OrderLine: [],
+        PaymentMethod: [],
         Product: [],
         ProductOption: [],
         ProductOptionGroup: [],
         ProductVariant: [],
-        User: [],
+        Promotion: [],
         ShippingMethod: [],
+        TaxCategory: [],
+        TaxRate: [],
+        User: [],
+        Zone: [],
     },
     plugins: [],
 };

+ 6 - 1
packages/core/src/entity/country/country-translation.entity.ts

@@ -3,12 +3,14 @@ import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, ManyToOne } from 'typeorm';
 
 import { Translation } from '../../common/types/locale-types';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
+import { CustomCountryFieldsTranslation } from '../custom-entity-fields';
 
 import { Country } from './country.entity';
 
 @Entity()
-export class CountryTranslation extends VendureEntity implements Translation<Country> {
+export class CountryTranslation extends VendureEntity implements Translation<Country>, HasCustomFields {
     constructor(input?: DeepPartial<Translation<CountryTranslation>>) {
         super(input);
     }
@@ -19,4 +21,7 @@ export class CountryTranslation extends VendureEntity implements Translation<Cou
 
     @ManyToOne(type => Country, base => base.translations, { onDelete: 'CASCADE' })
     base: Country;
+
+    @Column(type => CustomCountryFieldsTranslation)
+    customFields: CustomCountryFieldsTranslation;
 }

+ 6 - 1
packages/core/src/entity/country/country.entity.ts

@@ -2,7 +2,9 @@ import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, OneToMany } from 'typeorm';
 
 import { LocaleString, Translatable, Translation } from '../../common/types/locale-types';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
+import { CustomCountryFields } from '../custom-entity-fields';
 
 import { CountryTranslation } from './country-translation.entity';
 
@@ -15,7 +17,7 @@ import { CountryTranslation } from './country-translation.entity';
  * @docsCategory entities
  */
 @Entity()
-export class Country extends VendureEntity implements Translatable {
+export class Country extends VendureEntity implements Translatable, HasCustomFields {
     constructor(input?: DeepPartial<Country>) {
         super(input);
     }
@@ -28,4 +30,7 @@ export class Country extends VendureEntity implements Translatable {
 
     @OneToMany(type => CountryTranslation, translation => translation.base, { eager: true })
     translations: Array<Translation<Country>>;
+
+    @Column(type => CustomCountryFields)
+    customFields: CustomCountryFields;
 }

+ 15 - 7
packages/core/src/entity/custom-entity-fields.ts

@@ -1,26 +1,34 @@
 export class CustomAddressFields {}
 export class CustomAdministratorFields {}
 export class CustomAssetFields {}
+export class CustomChannelFields {}
+export class CustomCollectionFields {}
+export class CustomCollectionFieldsTranslation {}
+export class CustomCountryFields {}
+export class CustomCountryFieldsTranslation {}
+export class CustomCustomerFields {}
+export class CustomCustomerGroupFields {}
 export class CustomFacetFields {}
 export class CustomFacetFieldsTranslation {}
 export class CustomFacetValueFields {}
 export class CustomFacetValueFieldsTranslation {}
 export class CustomFulfillmentFields {}
-export class CustomCustomerFields {}
+export class CustomGlobalSettingsFields {}
+export class CustomOrderFields {}
 export class CustomOrderLineFields {}
+export class CustomPaymentMethodFields {}
 export class CustomProductFields {}
 export class CustomProductFieldsTranslation {}
-export class CustomCollectionFields {}
-export class CustomCollectionFieldsTranslation {}
-export class CustomChannelFields {}
 export class CustomProductOptionFields {}
 export class CustomProductOptionFieldsTranslation {}
 export class CustomProductOptionGroupFields {}
 export class CustomProductOptionGroupFieldsTranslation {}
 export class CustomProductVariantFields {}
 export class CustomProductVariantFieldsTranslation {}
-export class CustomUserFields {}
-export class CustomGlobalSettingsFields {}
-export class CustomOrderFields {}
+export class CustomPromotionFields {}
 export class CustomShippingMethodFields {}
 export class CustomShippingMethodFieldsTranslation {}
+export class CustomTaxCategoryFields {}
+export class CustomTaxRateFields {}
+export class CustomUserFields {}
+export class CustomZoneFields {}

+ 7 - 2
packages/core/src/entity/customer-group/customer-group.entity.ts

@@ -1,7 +1,9 @@
 import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, ManyToMany } from 'typeorm';
 
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
+import { CustomCustomerGroupFields } from '../custom-entity-fields';
 import { Customer } from '../customer/customer.entity';
 
 /**
@@ -12,13 +14,16 @@ import { Customer } from '../customer/customer.entity';
  * @docsCategory entities
  */
 @Entity()
-export class CustomerGroup extends VendureEntity {
+export class CustomerGroup extends VendureEntity implements HasCustomFields {
     constructor(input?: DeepPartial<CustomerGroup>) {
         super(input);
     }
 
     @Column() name: string;
 
-    @ManyToMany((type) => Customer, (customer) => customer.groups)
+    @ManyToMany(type => Customer, customer => customer.groups)
     customers: Customer[];
+
+    @Column(type => CustomCustomerGroupFields)
+    customFields: CustomCustomerGroupFields;
 }

+ 6 - 1
packages/core/src/entity/payment-method/payment-method.entity.ts

@@ -3,8 +3,10 @@ import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, JoinTable, ManyToMany } from 'typeorm';
 
 import { ChannelAware } from '../../common/types/common-types';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
 import { Channel } from '../channel/channel.entity';
+import { CustomPaymentMethodFields } from '../custom-entity-fields';
 
 /**
  * @description
@@ -14,7 +16,7 @@ import { Channel } from '../channel/channel.entity';
  * @docsCategory entities
  */
 @Entity()
-export class PaymentMethod extends VendureEntity implements ChannelAware {
+export class PaymentMethod extends VendureEntity implements ChannelAware, HasCustomFields {
     constructor(input?: DeepPartial<PaymentMethod>) {
         super(input);
     }
@@ -34,4 +36,7 @@ export class PaymentMethod extends VendureEntity implements ChannelAware {
     @ManyToMany(type => Channel)
     @JoinTable()
     channels: Channel[];
+
+    @Column(type => CustomPaymentMethodFields)
+    customFields: CustomPaymentMethodFields;
 }

+ 6 - 1
packages/core/src/entity/promotion/promotion.entity.ts

@@ -6,6 +6,7 @@ import { RequestContext } from '../../api/common/request-context';
 import { AdjustmentSource } from '../../common/types/adjustment-source';
 import { ChannelAware, SoftDeletable } from '../../common/types/common-types';
 import { getConfig } from '../../config/config-helpers';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import {
     PromotionAction,
     PromotionItemAction,
@@ -14,6 +15,7 @@ import {
 } from '../../config/promotion/promotion-action';
 import { PromotionCondition, PromotionConditionState } from '../../config/promotion/promotion-condition';
 import { Channel } from '../channel/channel.entity';
+import { CustomPromotionFields } from '../custom-entity-fields';
 import { OrderItem } from '../order-item/order-item.entity';
 import { OrderLine } from '../order-line/order-line.entity';
 import { Order } from '../order/order.entity';
@@ -50,7 +52,7 @@ export type PromotionTestResult = boolean | PromotionState;
  * @docsCategory entities
  */
 @Entity()
-export class Promotion extends AdjustmentSource implements ChannelAware, SoftDeletable {
+export class Promotion extends AdjustmentSource implements ChannelAware, SoftDeletable, HasCustomFields {
     type = AdjustmentType.PROMOTION;
     private readonly allConditions: { [code: string]: PromotionCondition } = {};
     private readonly allActions: {
@@ -95,6 +97,9 @@ export class Promotion extends AdjustmentSource implements ChannelAware, SoftDel
     @JoinTable()
     channels: Channel[];
 
+    @Column(type => CustomPromotionFields)
+    customFields: CustomPromotionFields;
+
     @Column('simple-json') conditions: ConfigurableOperation[];
 
     @Column('simple-json') actions: ConfigurableOperation[];

+ 18 - 4
packages/core/src/entity/register-custom-entity-fields.ts

@@ -1,4 +1,4 @@
-import { CustomFieldType, Type } from '@vendure/common/lib/shared-types';
+import { CustomFieldType } from '@vendure/common/lib/shared-types';
 import { assertNever } from '@vendure/common/lib/shared-utils';
 import {
     Column,
@@ -9,8 +9,6 @@ import {
     JoinTable,
     ManyToMany,
     ManyToOne,
-    OneToMany,
-    OneToOne,
 } from 'typeorm';
 import { DateUtils } from 'typeorm/util/DateUtils';
 
@@ -25,7 +23,10 @@ import {
     CustomChannelFields,
     CustomCollectionFields,
     CustomCollectionFieldsTranslation,
+    CustomCountryFields,
+    CustomCountryFieldsTranslation,
     CustomCustomerFields,
+    CustomCustomerGroupFields,
     CustomFacetFields,
     CustomFacetFieldsTranslation,
     CustomFacetValueFields,
@@ -34,6 +35,7 @@ import {
     CustomGlobalSettingsFields,
     CustomOrderFields,
     CustomOrderLineFields,
+    CustomPaymentMethodFields,
     CustomProductFields,
     CustomProductFieldsTranslation,
     CustomProductOptionFields,
@@ -42,9 +44,13 @@ import {
     CustomProductOptionGroupFieldsTranslation,
     CustomProductVariantFields,
     CustomProductVariantFieldsTranslation,
+    CustomPromotionFields,
     CustomShippingMethodFields,
     CustomShippingMethodFieldsTranslation,
+    CustomTaxCategoryFields,
+    CustomTaxRateFields,
     CustomUserFields,
+    CustomZoneFields,
 } from './custom-entity-fields';
 
 /**
@@ -226,8 +232,11 @@ export function registerCustomEntityFields(config: VendureConfig) {
     registerCustomFieldsForEntity(config, 'Asset', CustomAssetFields);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFields);
     registerCustomFieldsForEntity(config, 'Collection', CustomCollectionFieldsTranslation, true);
-    registerCustomFieldsForEntity(config, 'Customer', CustomCustomerFields);
     registerCustomFieldsForEntity(config, 'Channel', CustomChannelFields);
+    registerCustomFieldsForEntity(config, 'Country', CustomCountryFields);
+    registerCustomFieldsForEntity(config, 'Country', CustomCountryFieldsTranslation, true);
+    registerCustomFieldsForEntity(config, 'Customer', CustomCustomerFields);
+    registerCustomFieldsForEntity(config, 'CustomerGroup', CustomCustomerGroupFields);
     registerCustomFieldsForEntity(config, 'Facet', CustomFacetFields);
     registerCustomFieldsForEntity(config, 'Facet', CustomFacetFieldsTranslation, true);
     registerCustomFieldsForEntity(config, 'FacetValue', CustomFacetValueFields);
@@ -235,6 +244,7 @@ export function registerCustomEntityFields(config: VendureConfig) {
     registerCustomFieldsForEntity(config, 'Fulfillment', CustomFulfillmentFields);
     registerCustomFieldsForEntity(config, 'Order', CustomOrderFields);
     registerCustomFieldsForEntity(config, 'OrderLine', CustomOrderLineFields);
+    registerCustomFieldsForEntity(config, 'PaymentMethod', CustomPaymentMethodFields);
     registerCustomFieldsForEntity(config, 'Product', CustomProductFields);
     registerCustomFieldsForEntity(config, 'Product', CustomProductFieldsTranslation, true);
     registerCustomFieldsForEntity(config, 'ProductOption', CustomProductOptionFields);
@@ -248,8 +258,12 @@ export function registerCustomEntityFields(config: VendureConfig) {
     );
     registerCustomFieldsForEntity(config, 'ProductVariant', CustomProductVariantFields);
     registerCustomFieldsForEntity(config, 'ProductVariant', CustomProductVariantFieldsTranslation, true);
+    registerCustomFieldsForEntity(config, 'Promotion', CustomPromotionFields);
+    registerCustomFieldsForEntity(config, 'TaxCategory', CustomTaxCategoryFields);
+    registerCustomFieldsForEntity(config, 'TaxRate', CustomTaxRateFields);
     registerCustomFieldsForEntity(config, 'User', CustomUserFields);
     registerCustomFieldsForEntity(config, 'GlobalSettings', CustomGlobalSettingsFields);
     registerCustomFieldsForEntity(config, 'ShippingMethod', CustomShippingMethodFields);
     registerCustomFieldsForEntity(config, 'ShippingMethod', CustomShippingMethodFieldsTranslation, true);
+    registerCustomFieldsForEntity(config, 'Zone', CustomZoneFields);
 }

+ 6 - 1
packages/core/src/entity/tax-category/tax-category.entity.ts

@@ -1,7 +1,9 @@
 import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity } from 'typeorm';
 
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
+import { CustomTaxCategoryFields } from '../custom-entity-fields';
 
 /**
  * @description
@@ -10,7 +12,7 @@ import { VendureEntity } from '../base/base.entity';
  * @docsCategory entities
  */
 @Entity()
-export class TaxCategory extends VendureEntity {
+export class TaxCategory extends VendureEntity implements HasCustomFields {
     constructor(input?: DeepPartial<TaxCategory>) {
         super(input);
     }
@@ -18,4 +20,7 @@ export class TaxCategory extends VendureEntity {
     @Column() name: string;
 
     @Column({ default: false }) isDefault: boolean;
+
+    @Column(type => CustomTaxCategoryFields)
+    customFields: CustomTaxCategoryFields;
 }

+ 6 - 1
packages/core/src/entity/tax-rate/tax-rate.entity.ts

@@ -4,7 +4,9 @@ import { Column, Entity, ManyToOne } from 'typeorm';
 
 import { grossPriceOf, netPriceOf, taxComponentOf, taxPayableOn } from '../../common/tax-utils';
 import { idsAreEqual } from '../../common/utils';
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
+import { CustomTaxRateFields } from '../custom-entity-fields';
 import { CustomerGroup } from '../customer-group/customer-group.entity';
 import { TaxCategory } from '../tax-category/tax-category.entity';
 import { DecimalTransformer } from '../value-transformers';
@@ -21,7 +23,7 @@ import { Zone } from '../zone/zone.entity';
  * @docsCategory entities
  */
 @Entity()
-export class TaxRate extends VendureEntity {
+export class TaxRate extends VendureEntity implements HasCustomFields {
     constructor(input?: DeepPartial<TaxRate>) {
         super(input);
     }
@@ -41,6 +43,9 @@ export class TaxRate extends VendureEntity {
     @ManyToOne(type => CustomerGroup, { nullable: true })
     customerGroup?: CustomerGroup;
 
+    @Column(type => CustomTaxRateFields)
+    customFields: CustomTaxRateFields;
+
     /**
      * Returns the tax component of a given gross price.
      */

+ 6 - 1
packages/core/src/entity/zone/zone.entity.ts

@@ -1,8 +1,10 @@
 import { DeepPartial } from '@vendure/common/lib/shared-types';
 import { Column, Entity, JoinTable, ManyToMany } from 'typeorm';
 
+import { HasCustomFields } from '../../config/custom-field/custom-field-types';
 import { VendureEntity } from '../base/base.entity';
 import { Country } from '../country/country.entity';
+import { CustomZoneFields } from '../custom-entity-fields';
 
 /**
  * @description
@@ -12,7 +14,7 @@ import { Country } from '../country/country.entity';
  * @docsCategory entities
  */
 @Entity()
-export class Zone extends VendureEntity {
+export class Zone extends VendureEntity implements HasCustomFields {
     constructor(input?: DeepPartial<Zone>) {
         super(input);
     }
@@ -22,4 +24,7 @@ export class Zone extends VendureEntity {
     @ManyToMany(type => Country)
     @JoinTable()
     members: Country[];
+
+    @Column(type => CustomZoneFields)
+    customFields: CustomZoneFields;
 }

+ 9 - 2
packages/dev-server/dev-config.ts

@@ -45,7 +45,6 @@ export const devConfig: VendureConfig = {
         cookieOptions: {
             secret: 'abc',
         },
-        // passwordHashingStrategy: new PlaintextHashingStrategy(),
     },
     dbConnectionOptions: {
         synchronize: false,
@@ -56,7 +55,15 @@ export const devConfig: VendureConfig = {
     paymentOptions: {
         paymentMethodHandlers: [dummyPaymentHandler],
     },
-    customFields: {},
+    customFields: {
+        Country: [{ name: 'foo', type: 'localeString' }],
+        CustomerGroup: [{ name: 'foo', type: 'string' }],
+        PaymentMethod: [{ name: 'foo', type: 'string' }],
+        Promotion: [{ name: 'foo', type: 'string' }],
+        TaxCategory: [{ name: 'foo', type: 'string' }],
+        TaxRate: [{ name: 'foo', type: 'string' }],
+        Zone: [{ name: 'foo', type: 'string' }],
+    },
     logger: new DefaultLogger({ level: LogLevel.Debug }),
     importExportOptions: {
         importAssetsDir: path.join(__dirname, 'import-assets'),

+ 30 - 1
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -479,6 +479,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -528,6 +529,7 @@ export type CountryTranslationInput = {
     id?: Maybe<Scalars['ID']>;
     languageCode: LanguageCode;
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -597,11 +599,13 @@ export type CreateCountryInput = {
     code: Scalars['String'];
     translations: Array<CountryTranslationInput>;
     enabled: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
     name: Scalars['String'];
     customerIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -654,6 +658,7 @@ export type CreatePaymentMethodInput = {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperationInput>;
     handler: ConfigurableOperationInput;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -711,6 +716,7 @@ export type CreatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions: Array<ConfigurableOperationInput>;
     actions: Array<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -738,6 +744,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
     name: Scalars['String'];
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -747,11 +754,13 @@ export type CreateTaxRateInput = {
     categoryId: Scalars['ID'];
     zoneId: Scalars['ID'];
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
     name: Scalars['String'];
     memberIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1117,19 +1126,26 @@ export type CustomFields = {
     Asset: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
+    Country: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
+    CustomerGroup: Array<CustomFieldConfig>;
     Facet: Array<CustomFieldConfig>;
     FacetValue: Array<CustomFieldConfig>;
     Fulfillment: Array<CustomFieldConfig>;
     GlobalSettings: Array<CustomFieldConfig>;
     Order: Array<CustomFieldConfig>;
     OrderLine: Array<CustomFieldConfig>;
+    PaymentMethod: Array<CustomFieldConfig>;
     Product: Array<CustomFieldConfig>;
     ProductOption: Array<CustomFieldConfig>;
     ProductOptionGroup: Array<CustomFieldConfig>;
     ProductVariant: Array<CustomFieldConfig>;
-    User: Array<CustomFieldConfig>;
+    Promotion: Array<CustomFieldConfig>;
     ShippingMethod: Array<CustomFieldConfig>;
+    TaxCategory: Array<CustomFieldConfig>;
+    TaxRate: Array<CustomFieldConfig>;
+    User: Array<CustomFieldConfig>;
+    Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1173,6 +1189,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -3165,6 +3182,7 @@ export type PaymentMethod = Node & {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperation>;
     handler: ConfigurableOperation;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3686,6 +3704,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4478,6 +4497,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4495,6 +4515,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4657,11 +4678,13 @@ export type UpdateCountryInput = {
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<CountryTranslationInput>>;
     enabled?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -4736,6 +4759,7 @@ export type UpdatePaymentMethodInput = {
     enabled?: Maybe<Scalars['Boolean']>;
     checker?: Maybe<ConfigurableOperationInput>;
     handler?: Maybe<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -4789,6 +4813,7 @@ export type UpdatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions?: Maybe<Array<ConfigurableOperationInput>>;
     actions?: Maybe<Array<ConfigurableOperationInput>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -4820,6 +4845,7 @@ export type UpdateTaxCategoryInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -4830,11 +4856,13 @@ export type UpdateTaxRateInput = {
     categoryId?: Maybe<Scalars['ID']>;
     zoneId?: Maybe<Scalars['ID']>;
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type User = Node & {
@@ -4855,6 +4883,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type ReindexMutationVariables = Exact<{ [key: string]: never }>;

+ 34 - 5
packages/payment-plugin/e2e/graphql/generated-admin-types.ts

@@ -479,6 +479,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryFilterParameter = {
@@ -528,6 +529,7 @@ export type CountryTranslationInput = {
     id?: Maybe<Scalars['ID']>;
     languageCode: LanguageCode;
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateAddressInput = {
@@ -597,11 +599,13 @@ export type CreateCountryInput = {
     code: Scalars['String'];
     translations: Array<CountryTranslationInput>;
     enabled: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerGroupInput = {
     name: Scalars['String'];
     customerIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateCustomerInput = {
@@ -654,6 +658,7 @@ export type CreatePaymentMethodInput = {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperationInput>;
     handler: ConfigurableOperationInput;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateProductInput = {
@@ -711,6 +716,7 @@ export type CreatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions: Array<ConfigurableOperationInput>;
     actions: Array<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreatePromotionResult = Promotion | MissingConditionsError;
@@ -738,6 +744,7 @@ export type CreateTagInput = {
 export type CreateTaxCategoryInput = {
     name: Scalars['String'];
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateTaxRateInput = {
@@ -747,11 +754,13 @@ export type CreateTaxRateInput = {
     categoryId: Scalars['ID'];
     zoneId: Scalars['ID'];
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CreateZoneInput = {
     name: Scalars['String'];
     memberIds?: Maybe<Array<Scalars['ID']>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 /**
@@ -1117,19 +1126,26 @@ export type CustomFields = {
     Asset: Array<CustomFieldConfig>;
     Channel: Array<CustomFieldConfig>;
     Collection: Array<CustomFieldConfig>;
+    Country: Array<CustomFieldConfig>;
     Customer: Array<CustomFieldConfig>;
+    CustomerGroup: Array<CustomFieldConfig>;
     Facet: Array<CustomFieldConfig>;
     FacetValue: Array<CustomFieldConfig>;
     Fulfillment: Array<CustomFieldConfig>;
     GlobalSettings: Array<CustomFieldConfig>;
     Order: Array<CustomFieldConfig>;
     OrderLine: Array<CustomFieldConfig>;
+    PaymentMethod: Array<CustomFieldConfig>;
     Product: Array<CustomFieldConfig>;
     ProductOption: Array<CustomFieldConfig>;
     ProductOptionGroup: Array<CustomFieldConfig>;
     ProductVariant: Array<CustomFieldConfig>;
-    User: Array<CustomFieldConfig>;
+    Promotion: Array<CustomFieldConfig>;
     ShippingMethod: Array<CustomFieldConfig>;
+    TaxCategory: Array<CustomFieldConfig>;
+    TaxRate: Array<CustomFieldConfig>;
+    User: Array<CustomFieldConfig>;
+    Zone: Array<CustomFieldConfig>;
 };
 
 export type Customer = Node & {
@@ -1173,6 +1189,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -2966,7 +2983,7 @@ export type OrderItem = Node & {
     /** The price of a single unit including discounts and tax */
     discountedUnitPriceWithTax: Scalars['Int'];
     /**
-     * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax
      * and refund calculations.
      */
@@ -3014,7 +3031,7 @@ export type OrderLine = Node & {
     /** The price of a single unit including discounts and tax */
     discountedUnitPriceWithTax: Scalars['Int'];
     /**
-     * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax
      * and refund calculations.
      */
@@ -3026,14 +3043,14 @@ export type OrderLine = Node & {
     taxRate: Scalars['Float'];
     /** The total price of the line excluding tax and discounts. */
     linePrice: Scalars['Int'];
-    /** The total price of the line including tax bit excluding discounts. */
+    /** The total price of the line including tax but excluding discounts. */
     linePriceWithTax: Scalars['Int'];
     /** The price of the line including discounts, excluding tax */
     discountedLinePrice: Scalars['Int'];
     /** The price of the line including discounts and tax */
     discountedLinePriceWithTax: Scalars['Int'];
     /**
-     * The actual line price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual line price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax
      * and refund calculations.
      */
@@ -3165,6 +3182,7 @@ export type PaymentMethod = Node & {
     enabled: Scalars['Boolean'];
     checker?: Maybe<ConfigurableOperation>;
     handler: ConfigurableOperation;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFilterParameter = {
@@ -3686,6 +3704,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionFilterParameter = {
@@ -4478,6 +4497,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -4495,6 +4515,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateFilterParameter = {
@@ -4657,11 +4678,13 @@ export type UpdateCountryInput = {
     code?: Maybe<Scalars['String']>;
     translations?: Maybe<Array<CountryTranslationInput>>;
     enabled?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerGroupInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateCustomerInput = {
@@ -4736,6 +4759,7 @@ export type UpdatePaymentMethodInput = {
     enabled?: Maybe<Scalars['Boolean']>;
     checker?: Maybe<ConfigurableOperationInput>;
     handler?: Maybe<ConfigurableOperationInput>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductInput = {
@@ -4789,6 +4813,7 @@ export type UpdatePromotionInput = {
     perCustomerUsageLimit?: Maybe<Scalars['Int']>;
     conditions?: Maybe<Array<ConfigurableOperationInput>>;
     actions?: Maybe<Array<ConfigurableOperationInput>>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
@@ -4820,6 +4845,7 @@ export type UpdateTaxCategoryInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
     isDefault?: Maybe<Scalars['Boolean']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateTaxRateInput = {
@@ -4830,11 +4856,13 @@ export type UpdateTaxRateInput = {
     categoryId?: Maybe<Scalars['ID']>;
     zoneId?: Maybe<Scalars['ID']>;
     customerGroupId?: Maybe<Scalars['ID']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateZoneInput = {
     id: Scalars['ID'];
     name?: Maybe<Scalars['String']>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type User = Node & {
@@ -4855,6 +4883,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PaymentMethodFragment = Pick<

+ 10 - 4
packages/payment-plugin/e2e/graphql/generated-shop-types.ts

@@ -279,6 +279,7 @@ export type Country = Node & {
     name: Scalars['String'];
     enabled: Scalars['Boolean'];
     translations: Array<CountryTranslation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CountryList = PaginatedList & {
@@ -732,6 +733,7 @@ export type CustomerGroup = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     customers: CustomerList;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type CustomerGroupCustomersArgs = {
@@ -1837,7 +1839,7 @@ export type OrderItem = Node & {
     /** The price of a single unit including discounts and tax */
     discountedUnitPriceWithTax: Scalars['Int'];
     /**
-     * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax
      * and refund calculations.
      */
@@ -1885,7 +1887,7 @@ export type OrderLine = Node & {
     /** The price of a single unit including discounts and tax */
     discountedUnitPriceWithTax: Scalars['Int'];
     /**
-     * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual unit price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax
      * and refund calculations.
      */
@@ -1897,14 +1899,14 @@ export type OrderLine = Node & {
     taxRate: Scalars['Float'];
     /** The total price of the line excluding tax and discounts. */
     linePrice: Scalars['Int'];
-    /** The total price of the line including tax bit excluding discounts. */
+    /** The total price of the line including tax but excluding discounts. */
     linePriceWithTax: Scalars['Int'];
     /** The price of the line including discounts, excluding tax */
     discountedLinePrice: Scalars['Int'];
     /** The price of the line including discounts and tax */
     discountedLinePriceWithTax: Scalars['Int'];
     /**
-     * The actual line price, taking into account both item discounts _and_ prorated (proportially-distributed)
+     * The actual line price, taking into account both item discounts _and_ prorated (proportionally-distributed)
      * Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax
      * and refund calculations.
      */
@@ -2449,6 +2451,7 @@ export type Promotion = Node & {
     enabled: Scalars['Boolean'];
     conditions: Array<ConfigurableOperation>;
     actions: Array<ConfigurableOperation>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type PromotionList = PaginatedList & {
@@ -2810,6 +2813,7 @@ export type TaxCategory = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     isDefault: Scalars['Boolean'];
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxLine = {
@@ -2827,6 +2831,7 @@ export type TaxRate = Node & {
     category: TaxCategory;
     zone: Zone;
     customerGroup?: Maybe<CustomerGroup>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TaxRateList = PaginatedList & {
@@ -2934,6 +2939,7 @@ export type Zone = Node & {
     updatedAt: Scalars['DateTime'];
     name: Scalars['String'];
     members: Array<Country>;
+    customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type TestOrderFragmentFragment = Pick<

File diff suppressed because it is too large
+ 0 - 0
schema-admin.json


File diff suppressed because it is too large
+ 0 - 0
schema-shop.json


Some files were not shown because too many files changed in this diff