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,15 @@
1
+ class CreateDemographicDemographicOptionalValues < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :optional_values do |t|
4
+ t.references :optional, null: false, index: true
5
+ t.string :slug, null: false
6
+ t.string :code, null: false
7
+ t.string :value
8
+ t.json :value_translate, default: {}
9
+ t.integer :order_num, default: 1
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :optional_values, :code, :unique => true
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDemographicUserOptionalValues < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :user_optionals do |t|
4
+ t.references :optional, null: false, index: {:name => "index_user_optional_id"}
5
+ t.references :user, null: false, index: {:name => "index_optional_values_user_id"}
6
+ t.references :optional_value, index: {:name => "index_user_optional_value_id"}
7
+ t.string :value
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class AddTokenToOptionals < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :optionals, :token, :string
4
+ add_index :optionals, [:token], :name => 'index_optionals_on_token', unique: true, where: 'token IS NOT NULL'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddTokenToOptionalValues < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :optional_values, :token, :string
4
+ add_index :optional_values, [:token], :name => 'index_optional_values_on_token', unique: true, where: 'token IS NOT NULL'
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module Demographic
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Demographic
4
+ config.generators.api_only = true
5
+ require 'kaminari'
6
+ require 'active_model_serializers'
7
+ require 'jwt'
8
+ require 'axlsx'
9
+ require 'roo'
10
+
11
+ config.generators do |g|
12
+ g.test_framework :rspec
13
+ g.fixture_replacement :factory_bot
14
+ g.factory_bot dir: 'spec/factories'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Demographic
4
+ VERSION = '0.8.6.RKM.89602.beta.0'
5
+ end
@@ -0,0 +1,78 @@
1
+ require "demographic/engine"
2
+ require 'active_support/dependencies'
3
+
4
+ module Demographic
5
+ class << self
6
+ attr_accessor :simple_inputs,
7
+ :multiples_inputs,
8
+ :parent_model,
9
+ :per_page,
10
+ :jwt_password
11
+ end
12
+
13
+ # Yield self on setup for nice config blocks
14
+ def self.setup(&block)
15
+ raise 'not block' unless block_given?
16
+
17
+ yield self
18
+ end
19
+
20
+ def self.attributes
21
+ %w(parent_model simple_inputs multiples_inputs)
22
+ end
23
+
24
+ def self.generate_code(optional_id, value)
25
+ Digest::MD5.hexdigest("#{optional_id}-#{value.to_s.str_slug}")
26
+ end
27
+
28
+ def self.generate_token
29
+ Digest::SHA1.hexdigest([Time.now, rand].join)
30
+ end
31
+
32
+ def self.generate_token_md5(process_id:, code:, slug:)
33
+ Digest::MD5.hexdigest("#{process_id}-#{code}-#{slug}")
34
+ end
35
+
36
+ def self.reference(ctx)
37
+ adjustable_id = ctx.path.split('/').last
38
+ parent_model = current_model(ctx)
39
+
40
+ adjustable = parent_model.to_s.capitalize.classify.constantize.find_by(id: adjustable_id)
41
+ return adjustable if adjustable.present?
42
+
43
+ parent_model.to_s.capitalize.classify.constantize.find_by!(id: adjustable_id)
44
+ end
45
+
46
+ def self.current_model(ctx)
47
+ Demographic.parent_model[current_context(ctx)]
48
+ rescue StandardError
49
+ end
50
+
51
+ def self.current_context(ctx)
52
+ ctx.path.split('/')[2].to_sym
53
+ rescue StandardError
54
+ end
55
+
56
+ def self.parent_model
57
+ if @parent_model.is_a?(Proc)
58
+ @parent_model.call
59
+ else
60
+ @parent_model
61
+ end
62
+ end
63
+ def self.input_types_allowed
64
+ {
65
+ 'num' => :number,
66
+ 'numero' => :number,
67
+ 'list' => :list,
68
+ 'lista' => :list,
69
+ 'date' => :date,
70
+ 'fecha' => :date,
71
+ 'bool' => :bool,
72
+ 'boolean' => :bool,
73
+ 'text' => :text,
74
+ 'texto' => :text,
75
+ 'radio' => :radio
76
+ }
77
+ end
78
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate init Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,11 @@
1
+ class InitGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ desc 'Copy files init demographic'
5
+
6
+ def copy_initializer
7
+ copy_file 'init_demographic.rb', 'config/initializers/init_demographic.rb'
8
+ FileUtils.mkdir_p('app/middleware') unless File.directory?('app/middleware')
9
+ copy_file 'policy_demographic.rb', 'app/middleware/policy_demographic.rb'
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # configuracion basica para manejo de tipos
2
+ # serializer_fields_user = campos que desean serializar en la lista de usuarios
3
+ Demographic.setup do |config|
4
+ config.simple_inputs = %w(text date number boolean)
5
+ config.multiples_inputs = %w(checkbox radio list)
6
+ config.per_page = 10 # opcional por defecto es 10
7
+ config.parent_model = { engagement: :survey,
8
+ performance: :enterprise_process } # puedes agregar el modulo y el modelo que necesitas
9
+ config.jwt_password = ENV['JWT_PASSWORD']
10
+ end
11
+
12
+ # este permite manajar cualquier configuracion que desee antes de ejecutar el evento en el controlador
13
+ # puedes manejar accesos y permisos tenant jwt, politicas etc, este es totalmente programable
14
+ # Rails.application.config.middleware.use PolicyDemographic
@@ -0,0 +1,70 @@
1
+ require 'rack/request'
2
+
3
+ class PolicyDemographic
4
+ def initialize app
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ @request = Rack::Request.new(env)
10
+ policy_demographic { @app.call(env) }
11
+ # rescue JWT::DecodeError, JWT::ExpiredSignature, PolicyException => e
12
+ # [403, { 'Content-Type' => 'application/json' }, ["Forbidden! #{e.to_s}"]]
13
+ # rescue ActiveRecord::RecordNotFound => e
14
+ # [404, { 'Content-Type' => 'application/json' }, ["Not found! error: #{e.to_s}"]]
15
+ end
16
+
17
+ private
18
+
19
+ # tienen tenant apartment agregar: require 'apartment/tenant'
20
+ # descomentar si usas tenant switch! y agregarlo en el metodo
21
+ def policy_demographic(&block)
22
+ return yield block if @request.path.match(/v1/).present?
23
+ return yield block if @request.path.match(/v2/).present?
24
+ return yield block if @request.path.eql?('/demographic/optionalTypes').present?
25
+ return yield block unless @request.path.match(/demographic/).present?
26
+
27
+ # ...
28
+ # switch!
29
+ # code
30
+ # ...
31
+ yield block
32
+ end
33
+
34
+ # descomentar si usas tenant
35
+ # def switch!
36
+ # Apartment::Tenant.switch! enterprise.tenant.scheme
37
+ # end
38
+
39
+ # descomentar si usas tenant
40
+ # def enterprise
41
+ # Enterprise.find_by!(token: decode['enterprise']['token'])
42
+ # end
43
+
44
+ # Obtiene la instancia del objeto (survey, process, etc)
45
+ # def adjustable
46
+ # Demographic.reference(@request)
47
+ # end
48
+
49
+ # retorna a que modelo (:survey, :enterprise_process, etc)
50
+ # def current_model
51
+ # Demographic.current_model(@request)
52
+ # end
53
+
54
+ # retorna a que contexto o producto pertenece (:performance, :engagement, :talent)
55
+ # def current_context
56
+ # Demographic.current_context(@request)
57
+ # end
58
+
59
+ # def user
60
+ # User.find(decode['id'])
61
+ # end
62
+
63
+ # def decode
64
+ # token = @request.env["HTTP_AUTHORIZATION"].split(' ')[1]
65
+ # decode = JWT.decode(token, 'test123', true, { algorithm: 'HS256' })
66
+ # raise 'fordidden!' unless decode
67
+
68
+ # decode[0]
69
+ # end
70
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate init_manual_update Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,12 @@
1
+ class InitManualUpdateGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ desc 'Copy new migrations files'
5
+
6
+ def copy_models_initializer
7
+ copy_file '20220427163444_add_token_to_optionals.rb', 'db/migrate/20220427163444_add_token_to_optionals.rb'
8
+ copy_file '20220427163507_add_token_to_optional_values.rb', 'db/migrate/20220427163507_add_token_to_optional_values.rb'
9
+ copy_file 'demographic_update_tokens.rake', 'lib/tasks/demographic_update_tokens.rake'
10
+ copy_file 'demographic_update_tokens_by_tenants.rake', 'lib/tasks/demographic_update_tokens_by_tenants.rake'
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class AddTokenToOptionals < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :optionals, :token, :string
4
+ add_index :optionals, [:token], :name => 'index_optionals_on_token', unique: true, where: 'token IS NOT NULL'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddTokenToOptionalValues < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :optional_values, :token, :string
4
+ add_index :optional_values, [:token], :name => 'index_optional_values_on_token', unique: true, where: 'token IS NOT NULL'
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ namespace :demographic do
2
+ desc "Will set token for optionals and optional values: rake demographic:update_tokens"
3
+ task :update_tokens => :environment do
4
+ ActiveRecord::Base.transaction do
5
+ Optional.all.where(token: nil).each { | optional|
6
+ optional.update({token: Demographic.generate_token})
7
+ }
8
+ OptionalValue.all.where(token: nil).each { | optional_value|
9
+ optional_value.update({token: Demographic.generate_token})
10
+ }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ namespace :demographic do
2
+ desc "Will set token for optionals and optional values: rake demographic:update_tokens_by_tenants"
3
+ task :update_tokens_by_tenants => :environment do
4
+ Apartment::Tenant.switch!('public')
5
+ enterprise_tokens = Enterprise.all.pluck(:token)
6
+ enterprise_tokens.each do |token|
7
+ set_tenant(token)
8
+ ActiveRecord::Base.transaction do
9
+ Optional.all.where(token: nil).each { | optional|
10
+ optional.update({token: Demographic.generate_token})
11
+ }
12
+ OptionalValue.all.where(token: nil).each { | optional_value|
13
+ optional_value.update({token: Demographic.generate_token})
14
+ }
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ def set_tenant(token)
21
+ Apartment::Tenant.switch!('public')
22
+ tenant = Tenant.find_by(token: token)
23
+ Apartment::Tenant.switch!(tenant.scheme)
24
+ end
@@ -0,0 +1,10 @@
1
+ class InitManualUpdateV2Generator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ desc 'New model and migration for custom parameter values'
5
+
6
+ def copy_models_initializer
7
+ copy_file '20240206120304_create_custom_parameter_values.rb', 'db/migrate/20240206120304_create_custom_parameter_values.rb'
8
+ copy_file 'custom_parameter_value.rb', 'app/models/custom_parameter_value.rb'
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreateCustomParameterValues < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :custom_parameter_values do |t|
4
+ t.references :resourceable, polymorphic: true, index: { name: 'index_custom_parameter_values_on_resourceable' }
5
+ t.string :value
6
+ t.references :optional, foreign_key: true
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class CustomParameterValue < ApplicationRecord
2
+ belongs_to :optional
3
+ belongs_to :resourceable, polymorphic: true
4
+ belongs_to :optional_value, optional: true
5
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate init_model Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,12 @@
1
+ class InitModelGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ desc 'Copy files models init demographic'
5
+
6
+ def copy_models_initializer
7
+ copy_file 'user.rb', 'app/models/user.rb'
8
+ copy_file 'optional.rb', 'app/models/optional.rb'
9
+ copy_file 'optional_value.rb', 'app/models/optional_value.rb'
10
+ copy_file 'user_optional.rb', 'app/models/user_optional.rb'
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class Optional < ApplicationRecord
2
+ belongs_to :adjustable, polymorphic: true
3
+ has_many :optional_values, dependent: :destroy
4
+ has_many :user_optionals, dependent: :destroy
5
+ end
@@ -0,0 +1,4 @@
1
+ class OptionalValue < ApplicationRecord
2
+ belongs_to :optional
3
+ has_many :user_optionals, dependent: :destroy
4
+ end
@@ -0,0 +1,5 @@
1
+ class User < ApplicationRecord
2
+ has_many :user_optionals, dependent: :destroy
3
+ has_many :optionals, through: :user_optionals
4
+ has_many :optional_values, through: :user_optionals
5
+ end
@@ -0,0 +1,5 @@
1
+ class UserOptional < ApplicationRecord
2
+ belongs_to :optional
3
+ belongs_to :optional_value, optional: true
4
+ belongs_to :user
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :demographic do
3
+ # # Task goes here
4
+ # end