demographic 0.8.6.RKM.89602.beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +479 -0
- data/Rakefile +22 -0
- data/app/controllers/demographic/application_controller.rb +87 -0
- data/app/controllers/demographic/custom_parameter_values_controller.rb +25 -0
- data/app/controllers/demographic/optionals_bulk_controller.rb +33 -0
- data/app/controllers/demographic/optionals_controller.rb +68 -0
- data/app/controllers/demographic/optionals_types_controller.rb +17 -0
- data/app/controllers/demographic/user_optionals_controller.rb +12 -0
- data/app/jobs/demographic/application_job.rb +4 -0
- data/app/mailers/demographic/application_mailer.rb +6 -0
- data/app/serializers/demographic/optionals/filter_list_serializer.rb +34 -0
- data/app/serializers/demographic/optionals/list_serializer.rb +17 -0
- data/app/serializers/demographic/optionals/optional_serializer.rb +20 -0
- data/app/serializers/demographic/optionals/value_serializer.rb +5 -0
- data/app/services/demographic/custom_parameter_values/index.rb +53 -0
- data/app/services/demographic/helpers/association_localizer.rb +13 -0
- data/app/services/demographic/helpers/import/bulk/build_optionals.rb +54 -0
- data/app/services/demographic/helpers/import/bulk/create_optional_values.rb +32 -0
- data/app/services/demographic/helpers/import/bulk/create_or_update_user_optionals.rb +110 -0
- data/app/services/demographic/helpers/import/create_optionals_list.rb +60 -0
- data/app/services/demographic/helpers/import/create_or_update_custom_parameter_values.rb +97 -0
- data/app/services/demographic/helpers/import/create_or_update_user_values.rb +161 -0
- data/app/services/demographic/helpers/import/create_or_update_values.rb +124 -0
- data/app/services/demographic/optional_values/create_list.rb +61 -0
- data/app/services/demographic/optional_values/update_list.rb +85 -0
- data/app/services/demographic/optionals/bulk_create.rb +115 -0
- data/app/services/demographic/optionals/bulk_create_validations.rb +122 -0
- data/app/services/demographic/optionals/create.rb +90 -0
- data/app/services/demographic/optionals/list.rb +51 -0
- data/app/services/demographic/optionals/optional_values.rb +52 -0
- data/app/services/demographic/optionals/update.rb +100 -0
- data/app/services/demographic/parse/data_serializer.rb +87 -0
- data/app/services/demographic/parse/types/values.rb +99 -0
- data/app/services/demographic/user_optionals/list.rb +60 -0
- data/app/services/import/templates/create_optionals.rb +26 -0
- data/app/services/import/templates/xlsx.rb +44 -0
- data/config/initializers/custom_classes/string.rb +11 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20201207181535_create_demographic_optionals.rb +18 -0
- data/db/migrate/20201207184210_create_users.rb +12 -0
- data/db/migrate/20201211204926_create_demographic_demographic_optional_values.rb +15 -0
- data/db/migrate/20201215193056_create_demographic_user_optional_values.rb +11 -0
- data/db/migrate/20220427163444_add_token_to_optionals.rb +6 -0
- data/db/migrate/20220427163507_add_token_to_optional_values.rb +6 -0
- data/lib/demographic/engine.rb +17 -0
- data/lib/demographic/version.rb +5 -0
- data/lib/demographic.rb +78 -0
- data/lib/generators/init/USAGE +8 -0
- data/lib/generators/init/init_generator.rb +11 -0
- data/lib/generators/init/templates/init_demographic.rb +14 -0
- data/lib/generators/init/templates/policy_demographic.rb +70 -0
- data/lib/generators/init_manual_update/USAGE +8 -0
- data/lib/generators/init_manual_update/init_manual_update_generator.rb +12 -0
- data/lib/generators/init_manual_update/templates/20220427163444_add_token_to_optionals.rb +6 -0
- data/lib/generators/init_manual_update/templates/20220427163507_add_token_to_optional_values.rb +6 -0
- data/lib/generators/init_manual_update/templates/demographic_update_tokens.rake +13 -0
- data/lib/generators/init_manual_update/templates/demographic_update_tokens_by_tenants.rake +24 -0
- data/lib/generators/init_manual_update_v2/init_manual_update_generator.rb +10 -0
- data/lib/generators/init_manual_update_v2/templates/20240206120304_create_custom_parameter_values.rb +10 -0
- data/lib/generators/init_manual_update_v2/templates/custom_parameter_value.rb +5 -0
- data/lib/generators/init_model/USAGE +8 -0
- data/lib/generators/init_model/init_model_generator.rb +12 -0
- data/lib/generators/init_model/templates/optional.rb +5 -0
- data/lib/generators/init_model/templates/optional_value.rb +4 -0
- data/lib/generators/init_model/templates/user.rb +5 -0
- data/lib/generators/init_model/templates/user_optional.rb +5 -0
- data/lib/tasks/demographic_tasks.rake +4 -0
- metadata +346 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require_dependency "demographic/application_controller"
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
class OptionalsController < ApplicationController
|
|
5
|
+
|
|
6
|
+
# GET /:module/optionals/list/:adjustable_id
|
|
7
|
+
def index
|
|
8
|
+
optionals = ::Demographic::Optionals::List.new(adjustable: adjustable,
|
|
9
|
+
page: params[:page],
|
|
10
|
+
term: params[:term],
|
|
11
|
+
per_page: per_page)
|
|
12
|
+
render json: optionals.to_json, status: 200
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# POST /:module/optionals/create/:adjustable_id
|
|
16
|
+
def create
|
|
17
|
+
optional = ::Demographic::Optionals::Create.new(adjustable: adjustable, data: allowed_params)
|
|
18
|
+
render json: optional.call, root: 'optional',
|
|
19
|
+
serializer: ::Demographic::Optionals::OptionalSerializer,
|
|
20
|
+
adapter: :json, status: 200
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# GET ':module/optionals/:optional_id/show/:adjustable_id'
|
|
24
|
+
def show
|
|
25
|
+
render json: optional_adjustable, root: 'optional',
|
|
26
|
+
serializer: ::Demographic::Optionals::OptionalSerializer, adapter: :json, status: 200
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# PUT /:module/optionals/:optional_id/update/:adjustable_id
|
|
30
|
+
def update
|
|
31
|
+
optional = ::Demographic::Optionals::Update.new(adjustable: adjustable,
|
|
32
|
+
optional: optional_adjustable,
|
|
33
|
+
data: allowed_params)
|
|
34
|
+
|
|
35
|
+
render json: optional.call, root: 'optional',
|
|
36
|
+
serializer: ::Demographic::Optionals::OptionalSerializer, adapter: :json, status: 200
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# DELETE /:module/optionals/:optional_id/update/:adjustable_id
|
|
40
|
+
def destroy
|
|
41
|
+
render json: optional_adjustable.destroy!, root: 'optional',
|
|
42
|
+
serializer: ::Demographic::Optionals::OptionalSerializer, adapter: :json, status: 200
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# GET /:module/optionals/filterList/:adjustable_id
|
|
46
|
+
def filter_list
|
|
47
|
+
render json: adjustable.optionals, root: 'optionals',
|
|
48
|
+
each_serializer: ::Demographic::Optionals::FilterListSerializer, adapter: :json, status: 200
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# GET /:module/optionals/:optional_token/optionalValues/:adjustable_id
|
|
52
|
+
def optional_values
|
|
53
|
+
service = ::Demographic::Optionals::OptionalValues.new(adjustable: adjustable, optional: optional_adjustable, page: params[:page], term: params[:term], per_page: per_page)
|
|
54
|
+
render json: service.call, status: 200
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# GET /:module/optionals/options
|
|
58
|
+
def options
|
|
59
|
+
render json: ::Demographic::Helpers::AssociationLocalizer.translations_for, status: 200
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def allowed_params
|
|
65
|
+
params.require(:optional).permit!
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_dependency "demographic/application_controller"
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
class OptionalsTypesController < ApplicationController
|
|
5
|
+
|
|
6
|
+
# GET demographic/optionalTypes
|
|
7
|
+
def index
|
|
8
|
+
render json: optional_types, status: 200
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def optional_types
|
|
14
|
+
{types: Demographic.multiples_inputs | Demographic.simple_inputs}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require_dependency "demographic/application_controller"
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
class UserOptionalsController < ApplicationController
|
|
5
|
+
|
|
6
|
+
# GET demographic/:module/userOptionals/list/:adjustable_id?user_token=
|
|
7
|
+
def index
|
|
8
|
+
service = Demographic::UserOptionals::List.new(user: user, adjustable: adjustable)
|
|
9
|
+
render json: service.perform
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Demographic
|
|
2
|
+
class Optionals::FilterListSerializer < ActiveModel::Serializer
|
|
3
|
+
attributes :label, :value, :type, :module
|
|
4
|
+
|
|
5
|
+
attribute :list
|
|
6
|
+
|
|
7
|
+
def value
|
|
8
|
+
object.id.to_s
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def label
|
|
12
|
+
object.name_translate[I18n.locale.to_s] || object.name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def type
|
|
16
|
+
object.input_type
|
|
17
|
+
end
|
|
18
|
+
def module
|
|
19
|
+
{::Demographic.parent_model.invert[object.adjustable_type.underscore.to_sym] => I18n.t("activerecord.errors.models.#{object.adjustable_type.underscore}.optional") }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def list
|
|
23
|
+
return [] if Demographic.simple_inputs.include?(object.input_type)
|
|
24
|
+
|
|
25
|
+
object.optional_values.map do |value|
|
|
26
|
+
{
|
|
27
|
+
label: value.value_translate[I18n.locale.to_s] || value.value,
|
|
28
|
+
value: value.id.to_s,
|
|
29
|
+
color: ''
|
|
30
|
+
}
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Demographic
|
|
2
|
+
class Optionals::ListSerializer < ActiveModel::Serializer
|
|
3
|
+
attributes :id, :code, :name_translate, :input_type, :created_at, :order, :key, :module, :token
|
|
4
|
+
|
|
5
|
+
def created_at
|
|
6
|
+
object.created_at.strftime('%d-%m-%Y')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def key
|
|
10
|
+
object.id
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def module
|
|
14
|
+
{::Demographic.parent_model.invert[object.adjustable_type.underscore.to_sym] => I18n.t("activerecord.errors.models.#{object.adjustable_type.underscore}.optional") }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Demographic
|
|
2
|
+
class Optionals::OptionalSerializer < ActiveModel::Serializer
|
|
3
|
+
attributes :id, :code, :name_translate, :input_type, :order, :min_value, :max_value, :created_at, :module
|
|
4
|
+
|
|
5
|
+
attribute :values
|
|
6
|
+
|
|
7
|
+
def created_at
|
|
8
|
+
object.created_at.strftime('%d-%m-%Y')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def values
|
|
12
|
+
return [] if Demographic.simple_inputs.include?(object.input_type)
|
|
13
|
+
|
|
14
|
+
object.optional_values.map{ |value| Optionals::ValueSerializer.new(value) }
|
|
15
|
+
end
|
|
16
|
+
def module
|
|
17
|
+
{::Demographic.parent_model.invert[object.adjustable_type.underscore.to_sym] => I18n.t("activerecord.errors.models.#{object.adjustable_type.underscore}.optional") }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
module CustomParameterValues
|
|
5
|
+
class Index
|
|
6
|
+
attr_accessor :record, :adjustable, :page, :per_page
|
|
7
|
+
|
|
8
|
+
def initialize(record:, adjustable:, page:, per_page:)
|
|
9
|
+
@record = record
|
|
10
|
+
@adjustable = adjustable
|
|
11
|
+
@page = page || 1
|
|
12
|
+
@per_page = per_page || 20
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call
|
|
16
|
+
optional_structure
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def optional_structure
|
|
22
|
+
custom_parameter_values_ids = record.custom_parameter_values.pluck(:id)
|
|
23
|
+
|
|
24
|
+
optionals.map do |optional|
|
|
25
|
+
mapped_value = optional.custom_parameter_values.select do |value|
|
|
26
|
+
custom_parameter_values_ids.include?(value.id)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
{
|
|
30
|
+
id: optional.id,
|
|
31
|
+
code: optional.code,
|
|
32
|
+
name: optional.name,
|
|
33
|
+
token: optional.token,
|
|
34
|
+
input_type: optional.input_type,
|
|
35
|
+
values: mapped_value.map do |custom_parameter_value|
|
|
36
|
+
{
|
|
37
|
+
id: custom_parameter_value.id,
|
|
38
|
+
value: custom_parameter_value&.optional_value&.value || custom_parameter_value&.value
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def optionals
|
|
46
|
+
@optionals ||= Optional.includes(:custom_parameter_values)
|
|
47
|
+
.where(adjustable_id: adjustable.id, adjustable_type: adjustable.class.name)
|
|
48
|
+
.page(page).per(@per_page)
|
|
49
|
+
.order(:created_at)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Demographic
|
|
2
|
+
module Helpers
|
|
3
|
+
class AssociationLocalizer
|
|
4
|
+
def self.translations_for
|
|
5
|
+
Rails.application.eager_load!
|
|
6
|
+
|
|
7
|
+
Demographic.parent_model.each_with_object({}) do |(key, value), hash|
|
|
8
|
+
hash[key] = I18n.t("activerecord.errors.models.#{value}.optional", default: key.to_s)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
module Helpers
|
|
5
|
+
module Import
|
|
6
|
+
module Bulk
|
|
7
|
+
class BuildOptionals
|
|
8
|
+
attr_reader :users_data, :parent_module, :reference_id
|
|
9
|
+
|
|
10
|
+
def initialize(users_data:, parent_module:, reference_id:)
|
|
11
|
+
@users_data = users_data
|
|
12
|
+
@parent_module = parent_module
|
|
13
|
+
@reference_id = reference_id
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call
|
|
17
|
+
ActiveRecord::Base.transaction do
|
|
18
|
+
data_optionals = data_optionals_service.call
|
|
19
|
+
return data_optionals unless data_optionals.success
|
|
20
|
+
|
|
21
|
+
optional_values_service(data_optionals[:data]).call
|
|
22
|
+
user_optionals_service(data_optionals[:data]).call
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
response_instance(success: true, message: '')
|
|
26
|
+
rescue => e
|
|
27
|
+
response_instance(success: false, message: e)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def data_optionals_service
|
|
33
|
+
Demographic::Parse::DataSerializer.new(users_data: users_data,
|
|
34
|
+
parent_module: parent_module,
|
|
35
|
+
reference_id: reference_id)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def optional_values_service(data_optionals)
|
|
39
|
+
CreateOptionalValues.new(data_optionals: data_optionals)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def user_optionals_service(data_optionals)
|
|
43
|
+
CreateOrUpdateUserOptionals.new(data_optionals: data_optionals)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def response_instance(success:, message:)
|
|
47
|
+
Struct.new(:success, :message)
|
|
48
|
+
.new(success, message)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
module Helpers
|
|
5
|
+
module Import
|
|
6
|
+
module Bulk
|
|
7
|
+
class CreateOptionalValues
|
|
8
|
+
attr_reader :optional_values, :data_optionals
|
|
9
|
+
|
|
10
|
+
def initialize(data_optionals:)
|
|
11
|
+
@data_optionals = data_optionals
|
|
12
|
+
@optional_values = @data_optionals.map { |data_optional| data_optional.except(:user_id) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call
|
|
16
|
+
create_optional_values
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def create_optional_values
|
|
22
|
+
OptionalValue.bulk_import(optional_values,
|
|
23
|
+
batch_size: 1000,
|
|
24
|
+
on_duplicate_key_ignore: true,
|
|
25
|
+
validate: false,
|
|
26
|
+
returning: :code)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
module Helpers
|
|
5
|
+
module Import
|
|
6
|
+
module Bulk
|
|
7
|
+
class CreateOrUpdateUserOptionals
|
|
8
|
+
attr_reader :data_optionals
|
|
9
|
+
attr_accessor :optional_values_codes, :optionals_ids,
|
|
10
|
+
:optionals_values_ids_by_code, :user_optionals_ids
|
|
11
|
+
|
|
12
|
+
def initialize(data_optionals:)
|
|
13
|
+
@data_optionals = data_optionals
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call
|
|
17
|
+
data_optionals.each_slice(1000) do |data_optionals_slice|
|
|
18
|
+
build_metadata(data_optionals_slice)
|
|
19
|
+
serialized_data = build_serialized_data(data_optionals_slice)
|
|
20
|
+
bulk_create(serialized_data[:to_create])
|
|
21
|
+
bulk_update(serialized_data[:to_update])
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def build_metadata(data_optionals_slice)
|
|
28
|
+
build_basic_data(data_optionals_slice)
|
|
29
|
+
build_optionals_values_ids_by_code
|
|
30
|
+
build_user_optionals_ids(data_optionals_slice)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def build_basic_data(data_optionals_slice)
|
|
34
|
+
@optional_values_codes = []
|
|
35
|
+
@optionals_ids = []
|
|
36
|
+
|
|
37
|
+
data_optionals_slice.each { |data_optional|
|
|
38
|
+
@optional_values_codes << data_optional[:code]
|
|
39
|
+
@optionals_ids << data_optional[:optional_id]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@optional_values_codes = @optional_values_codes.uniq
|
|
43
|
+
@optionals_ids = @optionals_ids.uniq
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def build_optionals_values_ids_by_code
|
|
47
|
+
@optionals_values_ids_by_code = OptionalValue.where(code: optional_values_codes)
|
|
48
|
+
.pluck(:code, :id).to_h
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def build_user_optionals_ids(data_optionals_slice)
|
|
52
|
+
user_ids = data_optionals_slice.map { |data_optional| data_optional[:user_id] }.uniq
|
|
53
|
+
|
|
54
|
+
@user_optionals_ids = UserOptional.where(optional_id: optionals_ids, user_id: user_ids)
|
|
55
|
+
.pluck(:optional_id, :user_id, :id, :optional_value_id)
|
|
56
|
+
.to_h { |(optional_id, user_id, id, optional_value_id)|
|
|
57
|
+
[[optional_id, user_id], { id: id, optional_value_id: optional_value_id }]
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def build_serialized_data(data_optionals_slice)
|
|
62
|
+
data_optionals_slice.reduce({ to_create: [], to_update: [] }) do |serialized_data_optionals, data_optional|
|
|
63
|
+
user_id = data_optional[:user_id]
|
|
64
|
+
next serialized_data_optionals if user_id.blank?
|
|
65
|
+
|
|
66
|
+
optional_value_id = optionals_values_ids_by_code[data_optional[:code]]
|
|
67
|
+
next serialized_data_optionals if optional_value_id.blank?
|
|
68
|
+
|
|
69
|
+
user_optional = user_optionals_ids[[data_optional[:optional_id], user_id]]
|
|
70
|
+
user_optional_data = {
|
|
71
|
+
user_id: user_id,
|
|
72
|
+
optional_id: data_optional[:optional_id],
|
|
73
|
+
optional_value_id: optional_value_id,
|
|
74
|
+
value: data_optional[:value]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if user_optional.present?
|
|
78
|
+
if user_optional[:optional_value_id] != optional_value_id
|
|
79
|
+
serialized_data_optionals[:to_update] << user_optional_data.merge(id: user_optional[:id])
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
next serialized_data_optionals
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
serialized_data_optionals[:to_create] << user_optional_data
|
|
86
|
+
|
|
87
|
+
serialized_data_optionals
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def bulk_create(data)
|
|
92
|
+
return unless data.present?
|
|
93
|
+
|
|
94
|
+
UserOptional.bulk_import(data, batch_size: 1000, validate: false)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def bulk_update(data)
|
|
98
|
+
return unless data.present?
|
|
99
|
+
|
|
100
|
+
UserOptional.bulk_import(data,
|
|
101
|
+
batch_size: 1000,
|
|
102
|
+
validate: false,
|
|
103
|
+
on_duplicate_key_update: { conflict_target: [:id],
|
|
104
|
+
columns: [:value, :optional_value_id] })
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Demographic
|
|
4
|
+
module Helpers
|
|
5
|
+
module Import
|
|
6
|
+
class CreateOptionalsList
|
|
7
|
+
def self.call(file_headers:, parent_module:, reference_id:, sheet_name: 'es')
|
|
8
|
+
@adjustable = parent_model(parent_module).to_s.capitalize.classify.constantize.find_by!(id: reference_id)
|
|
9
|
+
|
|
10
|
+
file_headers.grep(/optional_/).each do |optional_header|
|
|
11
|
+
name = optional_header.gsub('optional_', '').split('#').first
|
|
12
|
+
value_type = type(optional_header.split('#').last)
|
|
13
|
+
|
|
14
|
+
optional = @adjustable.optionals.find_by(code: name.parameterize.str_slug)
|
|
15
|
+
|
|
16
|
+
optional ||= @adjustable.optionals.create(attr_hash(name, sheet_name, value_type))
|
|
17
|
+
|
|
18
|
+
optional
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
{ success: true, message: 'success!!!' }
|
|
22
|
+
rescue StandardError => e
|
|
23
|
+
{ success: false, message: e.to_s }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def self.parent_model(parent_module)
|
|
29
|
+
parent = Demographic.parent_model[parent_module.to_sym]
|
|
30
|
+
raise 'init Demographic parent_model error param :module!!!' unless parent.present?
|
|
31
|
+
|
|
32
|
+
parent
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.attr_hash(name, sheet_name, value_type)
|
|
36
|
+
hash = { name: name,
|
|
37
|
+
code: name.parameterize.str_slug,
|
|
38
|
+
token: Demographic.generate_token,
|
|
39
|
+
name_translate: { sheet_name => name },
|
|
40
|
+
input_type: value_type }
|
|
41
|
+
|
|
42
|
+
hash.merge!(monolithe)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.monolithe
|
|
46
|
+
return {} unless Optional.new.attributes.key?('enterprise_process_id')
|
|
47
|
+
return {} unless @adjustable.try(:enterprise_process_id).present?
|
|
48
|
+
|
|
49
|
+
{ enterprise_process_id: @adjustable.try(:enterprise_process_id) }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.type(key)
|
|
53
|
+
key ||= 'list'
|
|
54
|
+
hash = Demographic.input_types_allowed
|
|
55
|
+
hash[key.downcase] || :list
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Demographic
|
|
3
|
+
module Helpers
|
|
4
|
+
module Import
|
|
5
|
+
class CreateOrUpdateCustomParameterValues
|
|
6
|
+
def self.call(record:, optionals:, parent_module:, reference_id:)
|
|
7
|
+
return { success: false, message: 'error has not optionls!!!' } unless optionals.present?
|
|
8
|
+
optionals = optionals.to_unsafe_h if optionals.is_a?(ActionController::Parameters)
|
|
9
|
+
|
|
10
|
+
optionals_array = []
|
|
11
|
+
|
|
12
|
+
optionals.each do |element|
|
|
13
|
+
next unless element[:optional_id].present?
|
|
14
|
+
|
|
15
|
+
optional = Optional.find_by!(id: element[:optional_id])
|
|
16
|
+
hash = { optional_id: optional.id }
|
|
17
|
+
|
|
18
|
+
if Demographic.simple_inputs.include?(optional.input_type)
|
|
19
|
+
hash.merge!(simple_input(record, optional, element))
|
|
20
|
+
next optionals_array << hash
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
optionals_array << hash.merge!(multiple_input(record, optional, element))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
{ success: true, message: 'Success!!!', optionals: optionals_array }
|
|
27
|
+
rescue StandardError => e
|
|
28
|
+
{ success: false, message: e.to_s, optionals: [] }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def self.multiple_input(record, optional, element)
|
|
34
|
+
record_optional = record.custom_parameter_values.find_by(optional_id: optional.id)
|
|
35
|
+
|
|
36
|
+
if record_optional.present? && !element[:optional_value_id].present?
|
|
37
|
+
record_optional.destroy!
|
|
38
|
+
return {}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return {} unless element[:optional_value_id].present?
|
|
42
|
+
|
|
43
|
+
optional_value = optional.optional_values.find_by(id: element[:optional_value_id])
|
|
44
|
+
return {} unless optional_value.present?
|
|
45
|
+
|
|
46
|
+
record_optional ||= record.custom_parameter_values.new
|
|
47
|
+
record_optional.optional_id = optional.id
|
|
48
|
+
record_optional.optional_value_id = optional_value.id
|
|
49
|
+
record_optional.value = optional_value.value
|
|
50
|
+
record_optional.save!
|
|
51
|
+
|
|
52
|
+
{ optional_user_id: record_optional.id, optional_value_id: optional_value.id }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.simple_input(record, optional, element)
|
|
56
|
+
current_value = format_value(element[:value], optional)
|
|
57
|
+
record_optional = record.custom_parameter_values.find_by(optional_id: optional.id)
|
|
58
|
+
|
|
59
|
+
if record_optional.present? && !element[:optional_value_id].present?
|
|
60
|
+
record_optional.destroy!
|
|
61
|
+
return {}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
return {} unless element[:optional_value_id].present?
|
|
65
|
+
|
|
66
|
+
optional_value = optional.optional_values.find_by(id: element[:optional_value_id])
|
|
67
|
+
return {} unless optional_value.present?
|
|
68
|
+
|
|
69
|
+
record_optional ||= record.custom_parameter_values.new
|
|
70
|
+
record_optional.optional_id = optional.id
|
|
71
|
+
record_optional.optional_value_id = optional_value.id
|
|
72
|
+
record_optional.value = optional_value.value
|
|
73
|
+
record_optional.save!
|
|
74
|
+
|
|
75
|
+
{ custom_parameter_value_id: record_optional.id, optional_value_id: optional_value.id }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def self.parent_model(parent_module)
|
|
80
|
+
parent = Demographic.parent_model[parent_module.to_sym]
|
|
81
|
+
raise 'init Demographic parent_model error param :module!!!' unless parent.present?
|
|
82
|
+
|
|
83
|
+
parent
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.format_value(value, optional)
|
|
87
|
+
return unless value.present?
|
|
88
|
+
|
|
89
|
+
return value.to_s.to_date.strftime if optional.input_type.eql?('date')
|
|
90
|
+
|
|
91
|
+
value.to_s
|
|
92
|
+
rescue StandardError
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|