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.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +479 -0
  4. data/Rakefile +22 -0
  5. data/app/controllers/demographic/application_controller.rb +87 -0
  6. data/app/controllers/demographic/custom_parameter_values_controller.rb +25 -0
  7. data/app/controllers/demographic/optionals_bulk_controller.rb +33 -0
  8. data/app/controllers/demographic/optionals_controller.rb +68 -0
  9. data/app/controllers/demographic/optionals_types_controller.rb +17 -0
  10. data/app/controllers/demographic/user_optionals_controller.rb +12 -0
  11. data/app/jobs/demographic/application_job.rb +4 -0
  12. data/app/mailers/demographic/application_mailer.rb +6 -0
  13. data/app/serializers/demographic/optionals/filter_list_serializer.rb +34 -0
  14. data/app/serializers/demographic/optionals/list_serializer.rb +17 -0
  15. data/app/serializers/demographic/optionals/optional_serializer.rb +20 -0
  16. data/app/serializers/demographic/optionals/value_serializer.rb +5 -0
  17. data/app/services/demographic/custom_parameter_values/index.rb +53 -0
  18. data/app/services/demographic/helpers/association_localizer.rb +13 -0
  19. data/app/services/demographic/helpers/import/bulk/build_optionals.rb +54 -0
  20. data/app/services/demographic/helpers/import/bulk/create_optional_values.rb +32 -0
  21. data/app/services/demographic/helpers/import/bulk/create_or_update_user_optionals.rb +110 -0
  22. data/app/services/demographic/helpers/import/create_optionals_list.rb +60 -0
  23. data/app/services/demographic/helpers/import/create_or_update_custom_parameter_values.rb +97 -0
  24. data/app/services/demographic/helpers/import/create_or_update_user_values.rb +161 -0
  25. data/app/services/demographic/helpers/import/create_or_update_values.rb +124 -0
  26. data/app/services/demographic/optional_values/create_list.rb +61 -0
  27. data/app/services/demographic/optional_values/update_list.rb +85 -0
  28. data/app/services/demographic/optionals/bulk_create.rb +115 -0
  29. data/app/services/demographic/optionals/bulk_create_validations.rb +122 -0
  30. data/app/services/demographic/optionals/create.rb +90 -0
  31. data/app/services/demographic/optionals/list.rb +51 -0
  32. data/app/services/demographic/optionals/optional_values.rb +52 -0
  33. data/app/services/demographic/optionals/update.rb +100 -0
  34. data/app/services/demographic/parse/data_serializer.rb +87 -0
  35. data/app/services/demographic/parse/types/values.rb +99 -0
  36. data/app/services/demographic/user_optionals/list.rb +60 -0
  37. data/app/services/import/templates/create_optionals.rb +26 -0
  38. data/app/services/import/templates/xlsx.rb +44 -0
  39. data/config/initializers/custom_classes/string.rb +11 -0
  40. data/config/routes.rb +38 -0
  41. data/db/migrate/20201207181535_create_demographic_optionals.rb +18 -0
  42. data/db/migrate/20201207184210_create_users.rb +12 -0
  43. data/db/migrate/20201211204926_create_demographic_demographic_optional_values.rb +15 -0
  44. data/db/migrate/20201215193056_create_demographic_user_optional_values.rb +11 -0
  45. data/db/migrate/20220427163444_add_token_to_optionals.rb +6 -0
  46. data/db/migrate/20220427163507_add_token_to_optional_values.rb +6 -0
  47. data/lib/demographic/engine.rb +17 -0
  48. data/lib/demographic/version.rb +5 -0
  49. data/lib/demographic.rb +78 -0
  50. data/lib/generators/init/USAGE +8 -0
  51. data/lib/generators/init/init_generator.rb +11 -0
  52. data/lib/generators/init/templates/init_demographic.rb +14 -0
  53. data/lib/generators/init/templates/policy_demographic.rb +70 -0
  54. data/lib/generators/init_manual_update/USAGE +8 -0
  55. data/lib/generators/init_manual_update/init_manual_update_generator.rb +12 -0
  56. data/lib/generators/init_manual_update/templates/20220427163444_add_token_to_optionals.rb +6 -0
  57. data/lib/generators/init_manual_update/templates/20220427163507_add_token_to_optional_values.rb +6 -0
  58. data/lib/generators/init_manual_update/templates/demographic_update_tokens.rake +13 -0
  59. data/lib/generators/init_manual_update/templates/demographic_update_tokens_by_tenants.rake +24 -0
  60. data/lib/generators/init_manual_update_v2/init_manual_update_generator.rb +10 -0
  61. data/lib/generators/init_manual_update_v2/templates/20240206120304_create_custom_parameter_values.rb +10 -0
  62. data/lib/generators/init_manual_update_v2/templates/custom_parameter_value.rb +5 -0
  63. data/lib/generators/init_model/USAGE +8 -0
  64. data/lib/generators/init_model/init_model_generator.rb +12 -0
  65. data/lib/generators/init_model/templates/optional.rb +5 -0
  66. data/lib/generators/init_model/templates/optional_value.rb +4 -0
  67. data/lib/generators/init_model/templates/user.rb +5 -0
  68. data/lib/generators/init_model/templates/user_optional.rb +5 -0
  69. data/lib/tasks/demographic_tasks.rake +4 -0
  70. 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,4 @@
1
+ module Demographic
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Demographic
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ 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,5 @@
1
+ module Demographic
2
+ class Optionals::ValueSerializer < ActiveModel::Serializer
3
+ attributes :id, :optional_id, :slug, :code, :order_num, :value_translate
4
+ end
5
+ 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