promonizr 1.13.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fed309f65e8324d77b60af02b5175fb67e5b98121106bb0960b95c3e9668c129
4
+ data.tar.gz: 30a328b823f945fceeaaaf7f29ad7f3d2ce1037e262f1a568bd0ba2b8b64c0b5
5
+ SHA512:
6
+ metadata.gz: cf43239476710236ed5c5692520176e803f2380cc90ef4716e62729e4894fa55d21e425a1caa027b4f938b5f99f8764e5a0cea140b29983c85e059382ff34f8b
7
+ data.tar.gz: 554e4409828c3f2e836d8a179c3943a1860eaa072b5d2125ac73d83959eee030dd3ead4d6a43863dc8b3dde19d90cba14d0b4ba746b21e710a35a888e6d7190f
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ load 'promotion_api'
@@ -0,0 +1,103 @@
1
+ ---
2
+ br:
3
+ promonizr:
4
+ actions: Acciones
5
+ add: Añadir
6
+ add_condition: Añadir condición
7
+ already_applied: ¿El beneficio ya fue aplicado?
8
+ amount: Cantidad
9
+ amount_hint: Cuántos 2x1 hay disponibles. Déjalo en blanco si no hay limites
10
+ applies:
11
+ from: Desde
12
+ to: Hasta
13
+ applies_to_installments: Aplica a las cuotas
14
+ applies_to_passengers: Aplica a los pasajeros
15
+ applies_to_passengers_hint: El primer pasajero es el %{first} y el último %{last}
16
+ benefits:
17
+ discount: Descuento
18
+ discount_percentage: Porcentaje de descuento
19
+ campaigns: Campañas
20
+ check_all: Marcar todas
21
+ clone: Clonar campaña
22
+ companies: Compañías
23
+ condition: Condición
24
+ condition_value: Valor
25
+ conditions:
26
+ between: Entre
27
+ eq: Igual a
28
+ gt: Mayor a
29
+ gte: Mayor o igual a
30
+ in: Dentro de
31
+ lt: Menor a
32
+ lte: Menor o igual a
33
+ neq: Distinto a
34
+ notIn: Fuera de
35
+ confirm_delete: "¿Estás seguro?"
36
+ countries:
37
+ br: Brasil
38
+ cl: Chile
39
+ co: Colombia
40
+ country: País
41
+ destroy: Borrar
42
+ discount_type: Tipo descuento
43
+ discount_value: Valor descuento
44
+ display_config: Configuración de visualización
45
+ edit: Editar campaña
46
+ end_date: Fecha de término
47
+ exclusions: Exclusiones
48
+ exclusions_hint: La promoción no se mostrará en estas páginas
49
+ featured_image: Imagen destacada
50
+ featured_label: "¿Es destacada?"
51
+ from_service: Procedencia
52
+ from_service_label: "¿La promoción proviene de un Web Service?"
53
+ gift_description: Descripción del regalo
54
+ gift_hint: Opcional, una breve descripción sobre el regalo
55
+ image: Imagen
56
+ kind: Tipo
57
+ kinds:
58
+ discount: Descuento
59
+ gift: Regalo
60
+ two_x_one: 2x1
61
+ new_campaign: Nueva campaña
62
+ not_rules_yet: No hay reglas aún
63
+ not_rules_yet_product_country: No hay reglas para esta combinación de país y producto
64
+ operator: Operador lógico
65
+ operators:
66
+ and: Y
67
+ or: O
68
+ payment_method: Medio de pago
69
+ payment_methods:
70
+ any: Cualquiera
71
+ product: Producto
72
+ products:
73
+ car_insurance: Seguro de auto
74
+ travel_assistance: Asistencia en viaje
75
+ remaining_characters: Caracteres restantes
76
+ required_dimensions: 'Dimensión requerida: %{height}×%{width} px'
77
+ rules: Reglas
78
+ save: Guardar
79
+ saving: Guardando...
80
+ simple_rules: Reglas simples
81
+ stage_pages:
82
+ landing: Landing
83
+ results: Página de resultados
84
+ sale: Sale page
85
+ start_date: Fecha de inicio
86
+ subtitle: Bajada
87
+ terms_of_service: Términos y condiciones
88
+ title: Título
89
+ uncheck_all: Desmarcar todas
90
+ update: Actualizar
91
+ hour: Hora
92
+ name: Nombre
93
+ short_description: Descripción breve
94
+ long_description: Descripción larga
95
+ special_event: Evento especial
96
+ special_events: Eventos especiales
97
+ new_special_event: Nuevo evento especial
98
+ edit_special_event: Editar evento especial
99
+ contest: Concurso
100
+ contests: Concursos
101
+ new_contest: Nuevo concurso
102
+ edit_contest: Editar concurso
103
+
@@ -0,0 +1,102 @@
1
+ ---
2
+ cl:
3
+ promonizr:
4
+ actions: Acciones
5
+ add: Añadir
6
+ add_condition: Añadir condición
7
+ already_applied: "¿El beneficio ya fue aplicado?"
8
+ amount: Cantidad
9
+ amount_hint: Cuántos 2x1 hay disponibles. Déjalo en blanco si no hay limites
10
+ applies:
11
+ from: Desde
12
+ to: Hasta
13
+ applies_to_installments: Aplica a las cuotas
14
+ applies_to_passengers: Aplica a los pasajeros
15
+ applies_to_passengers_hint: El primer pasajero es el %{first} y el último %{last}
16
+ benefits:
17
+ discount: Descuento
18
+ discount_percentage: Porcentaje de descuento
19
+ campaigns: Campañas
20
+ check_all: Marcar todas
21
+ clone: Clonar campaña
22
+ companies: Compañías
23
+ condition: Condición
24
+ condition_value: Valor
25
+ conditions:
26
+ between: Entre
27
+ eq: Igual a
28
+ gt: Mayor a
29
+ gte: Mayor o igual a
30
+ in: Dentro de
31
+ lt: Menor a
32
+ lte: Menor o igual a
33
+ neq: Distinto a
34
+ notIn: Fuera de
35
+ confirm_delete: "¿Estás seguro?"
36
+ countries:
37
+ br: Brasil
38
+ cl: Chile
39
+ co: Colombia
40
+ country: País
41
+ destroy: Borrar
42
+ discount_type: Tipo descuento
43
+ discount_value: Valor descuento
44
+ display_config: Configuración de visualización
45
+ edit: Editar campaña
46
+ end_date: Fecha de término
47
+ exclusions: Exclusiones
48
+ exclusions_hint: La promoción no se mostrará en estas páginas
49
+ featured_image: Imagen destacada
50
+ featured_label: "¿Es destacada?"
51
+ from_service: Procedencia
52
+ from_service_label: "¿La promoción proviene de un Web Service?"
53
+ gift_description: Descripción del regalo
54
+ gift_hint: Opcional, una breve descripción sobre el regalo
55
+ image: Imagen
56
+ kind: Tipo
57
+ kinds:
58
+ discount: Descuento
59
+ gift: Regalo
60
+ two_x_one: 2x1
61
+ new_campaign: Nueva campaña
62
+ not_rules_yet: No hay reglas aún
63
+ not_rules_yet_product_country: No hay reglas para esta combinación de país y producto
64
+ operator: Operador lógico
65
+ operators:
66
+ and: Y
67
+ or: O
68
+ payment_method: Medio de pago
69
+ payment_methods:
70
+ any: Cualquiera
71
+ product: Producto
72
+ products:
73
+ car_insurance: Seguro de auto
74
+ travel_assistance: Asistencia en viaje
75
+ remaining_characters: Caracteres restantes
76
+ required_dimensions: 'Dimensión requerida: %{height}×%{width} px'
77
+ rules: Reglas
78
+ save: Guardar
79
+ saving: Guardando...
80
+ simple_rules: Reglas simples
81
+ stage_pages:
82
+ landing: Landing
83
+ results: Página de resultados
84
+ sale: Sale page
85
+ start_date: Fecha de inicio
86
+ subtitle: Bajada
87
+ terms_of_service: Términos y condiciones
88
+ title: Título
89
+ uncheck_all: Desmarcar todas
90
+ update: Actualizar
91
+ hour: Hora
92
+ name: Nombre
93
+ short_description: Descripción breve
94
+ long_description: Descripción larga
95
+ special_event: Evento especial
96
+ special_events: Eventos especiales
97
+ new_special_event: Nuevo evento especial
98
+ edit_special_event: Editar evento especial
99
+ contest: Concurso
100
+ contests: Concursos
101
+ new_contest: Nuevo concurso
102
+ edit_contest: Editar concurso
@@ -0,0 +1,102 @@
1
+ ---
2
+ co:
3
+ promonizr:
4
+ actions: Acciones
5
+ add: Añadir
6
+ add_condition: Añadir condición
7
+ already_applied: ¿El beneficio ya fue aplicado?
8
+ amount: Cantidad
9
+ amount_hint: Cuántos 2x1 hay disponibles. Déjalo en blanco si no hay limites
10
+ applies:
11
+ from: Desde
12
+ to: Hasta
13
+ applies_to_installments: Aplica a las cuotas
14
+ applies_to_passengers: Aplica a los pasajeros
15
+ applies_to_passengers_hint: El primer pasajero es el %{first} y el último %{last}
16
+ benefits:
17
+ discount: Descuento
18
+ discount_percentage: Porcentaje de descuento
19
+ campaigns: Campañas
20
+ check_all: Marcar todas
21
+ clone: Clonar campaña
22
+ companies: Compañías
23
+ condition: Condición
24
+ condition_value: Valor
25
+ conditions:
26
+ between: Entre
27
+ eq: Igual a
28
+ gt: Mayor a
29
+ gte: Mayor o igual a
30
+ in: Dentro de
31
+ lt: Menor a
32
+ lte: Menor o igual a
33
+ neq: Distinto a
34
+ notIn: Fuera de
35
+ confirm_delete: "¿Estás seguro?"
36
+ countries:
37
+ br: Brasil
38
+ cl: Chile
39
+ co: Colombia
40
+ country: País
41
+ destroy: Borrar
42
+ discount_type: Tipo descuento
43
+ discount_value: Valor descuento
44
+ display_config: Configuración de visualización
45
+ edit: Editar campaña
46
+ end_date: Fecha de término
47
+ exclusions: Exclusiones
48
+ exclusions_hint: La promoción no se mostrará en estas páginas
49
+ featured_image: Imagen destacada
50
+ featured_label: "¿Es destacada?"
51
+ from_service: Procedencia
52
+ from_service_label: "¿La promoción proviene de un Web Service?"
53
+ gift_description: Descripción del regalo
54
+ gift_hint: Opcional, una breve descripción sobre el regalo
55
+ image: Imagen
56
+ kind: Tipo
57
+ kinds:
58
+ discount: Descuento
59
+ gift: Regalo
60
+ two_x_one: 2x1
61
+ new_campaign: Nueva campaña
62
+ not_rules_yet: No hay reglas aún
63
+ not_rules_yet_product_country: No hay reglas para esta combinación de país y producto
64
+ operator: Operador lógico
65
+ operators:
66
+ and: Y
67
+ or: O
68
+ payment_method: Medio de pago
69
+ payment_methods:
70
+ any: Cualquiera
71
+ product: Producto
72
+ products:
73
+ car_insurance: Seguro de auto
74
+ travel_assistance: Asistencia en viaje
75
+ remaining_characters: Caracteres restantes
76
+ required_dimensions: 'Dimensión requerida: %{height}×%{width} px'
77
+ rules: Reglas
78
+ save: Guardar
79
+ saving: Guardando...
80
+ simple_rules: Reglas simples
81
+ stage_pages:
82
+ landing: Landing
83
+ results: Página de resultados
84
+ sale: Sale page
85
+ start_date: Fecha de inicio
86
+ subtitle: Bajada
87
+ terms_of_service: Términos y condiciones
88
+ title: Título
89
+ uncheck_all: Desmarcar todas
90
+ update: Actualizar
91
+ hour: Hora
92
+ name: Nombre
93
+ short_description: Descripción breve
94
+ long_description: Descripción larga
95
+ special_event: Evento especial
96
+ special_events: Eventos especiales
97
+ new_special_event: Nuevo evento especial
98
+ edit_special_event: Editar evento especial
99
+ contest: Concurso
100
+ contests: Concursos
101
+ new_contest: Nuevo concurso
102
+ edit_contest: Editar concurso
@@ -0,0 +1,102 @@
1
+ ---
2
+ en:
3
+ promonizr:
4
+ actions: Actions
5
+ add: Add
6
+ add_condition: Add condition
7
+ already_applied: is benefit already applied?
8
+ amount: Amount
9
+ amount_hint: How many 2x1 are available. Leave it blank if there is no limits.
10
+ applies:
11
+ from: From
12
+ to: To
13
+ applies_to_installments: Applies to instalments
14
+ applies_to_passengers: Applies to passengers
15
+ applies_to_passengers_hint: El primer pasajero es el %{first} y el último %{last}
16
+ benefits:
17
+ discount: Discount
18
+ discount_percentage: Percentage discount
19
+ campaigns: Campaign
20
+ check_all: Check all
21
+ clone: Clone campaign
22
+ companies: Companies
23
+ condition: Condition
24
+ condition_value: Value
25
+ conditions:
26
+ between: Between
27
+ eq: Equal
28
+ gt: Greater than
29
+ gte: Great than or equal to
30
+ in: In
31
+ lt: Less than
32
+ lte: Less than or equal to
33
+ neq: Not equal
34
+ notIn: Not in
35
+ confirm_delete: Are you sure?
36
+ countries:
37
+ br: Brazil
38
+ cl: Chile
39
+ co: Colombia
40
+ country: Country
41
+ destroy: Destroy
42
+ discount_type: Discount type
43
+ discount_value: Discount value
44
+ display_config: Display config
45
+ edit: Edit campaign
46
+ end_date: End date
47
+ exclusions: Exclusions
48
+ exclusions_hint: La promoción no se mostrará en estas páginas
49
+ featured_image: Featured image
50
+ featured_label: Is it featured ?
51
+ from_service: From service
52
+ from_service_label: "¿La promoción proviene de un Web Service?"
53
+ gift_description: Gift description
54
+ gift_hint: Optional, a brief description about the gift
55
+ image: Image
56
+ kind: Type
57
+ kinds:
58
+ discount: Discount
59
+ gift: Gift
60
+ two_x_one: 2x1
61
+ new_campaign: New Campaign
62
+ not_rules_yet: There are not rules yet
63
+ not_rules_yet_product_country: There are not simple rules for this combination of product and country
64
+ operator: Logical operator
65
+ operators:
66
+ and: And
67
+ or: Or
68
+ payment_method: Payment method
69
+ payment_methods:
70
+ any: Any
71
+ product: Product
72
+ products:
73
+ car_insurance: Car insurance
74
+ travel_assistance: Travel assistance
75
+ remaining_characters: Remaining characters
76
+ required_dimensions: 'Required dimensions: %{height}×%{width} px'
77
+ rules: Rules
78
+ save: Save
79
+ saving: Saving...
80
+ simple_rules: Simple rules
81
+ stage_pages:
82
+ landing: Landing page
83
+ results: Results page
84
+ sale: Sale page
85
+ start_date: Start date
86
+ subtitle: Subtitle
87
+ terms_of_service: Terms of service
88
+ title: Title
89
+ uncheck_all: Uncheck all
90
+ update: Update
91
+ hour: Hour
92
+ name: Name
93
+ short_description: Short description
94
+ long_description: Long description
95
+ special_event: Special Event
96
+ special_events: Special Events
97
+ new_special_event: New Special Event
98
+ edit_special_event: Edit Special Event
99
+ contest: Contest
100
+ contests: Contests
101
+ new_contest: New contest
102
+ edit_contest: Edit contest
@@ -0,0 +1,19 @@
1
+ defaults: &defaults
2
+ url: https://ms-staging.comparaonline.com/promotions
3
+ cdn: https://webimg.comparaonline.com
4
+
5
+ development:
6
+ <<: *defaults
7
+ cdn: ''
8
+
9
+ qc:
10
+ <<: *defaults
11
+ cdn: https://qc.webimg.comparaonline.com
12
+
13
+ staging:
14
+ <<: *defaults
15
+ cdn: https://staging.webimg.comparaonline.com
16
+
17
+ production:
18
+ <<: *defaults
19
+ url: https://ms.comparaonline.com/promotions
@@ -0,0 +1,73 @@
1
+ module Promonizr
2
+ # Campaigns implements CRUD methods on the Campaign resource from the
3
+ # Promotions web service.
4
+ module Campaigns
5
+ JSON_ATTRIBUTES = %i(rules conditions benefits display_config companies).freeze
6
+
7
+ STAGE_CODES = %w(landing results).freeze
8
+ COUNTRY_CODES = %w(cl br co).freeze
9
+ KIND_CODES = %w(two_x_one discount gift).freeze
10
+ BENEFITS_BY_PRODUCT = {
11
+ car_insurance: %w(discount gift),
12
+ travel_assistance: %w(two_x_one discount)
13
+ }.freeze
14
+ RULE_OPERATORS = %w(and or).freeze
15
+ RULE_CONDITIONS = %w(eq neq lt gt lte gte in notIn between).freeze
16
+
17
+ VALIDATION_RULES = {
18
+ title: {
19
+ max_length: 62
20
+ },
21
+ subtitle: {
22
+ max_length: 200
23
+ }
24
+ }.freeze
25
+
26
+ module_function
27
+
28
+ def api_url
29
+ CoConfig::PROMOTION_API[:url] + '/campaigns'
30
+ end
31
+
32
+ def all
33
+ @campaigns = Request.execute(:get, api_url)
34
+ @campaigns.is_a?(Array) ? @campaigns : []
35
+ end
36
+
37
+ def create(params)
38
+ Request.execute(:post, api_url, sanitized_params(params))
39
+ end
40
+
41
+ def update(id, params)
42
+ Request.execute(:put, url_with_id(id), sanitized_params(params))
43
+ end
44
+
45
+ def destroy(id)
46
+ Request.execute(:delete, url_with_id(id))
47
+ end
48
+
49
+ def get(id)
50
+ Request.execute(:get, url_with_id(id))
51
+ end
52
+
53
+ def url_with_id(id)
54
+ "#{api_url}/#{id}"
55
+ end
56
+
57
+ # Ensures that columns defined in JSON_ATTRIBUTES are json strings.
58
+ # boolean values will be casted
59
+ def sanitized_params(params)
60
+ JSON_ATTRIBUTES.each do |json_column|
61
+ next unless params.key?(json_column)
62
+
63
+ if params[json_column].is_a?(String)
64
+ params[json_column] = JSON.parse(params[json_column])
65
+ end
66
+
67
+ params[json_column] = Utils.cast_values(params[json_column]).to_json
68
+ end
69
+
70
+ params
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,23 @@
1
+ module Promonizr
2
+ module Companies
3
+ module_function
4
+
5
+ # The gem's client must implement this in order to
6
+ # provide its own way to fetch all companies names.
7
+ # Returns: Array[String]
8
+ # Example:
9
+ # def all(...); Company.pluck(:name); end
10
+ def all(country_code, product_code_name)
11
+ raise NotImplementedError
12
+ end
13
+
14
+ # The gem's client must implement this in order to
15
+ # provide its own way to fetch companies using its url_name
16
+ # Returns: Array[String]
17
+ # Example:
18
+ # def by_url_names(...); Company.where(url_name: url_names); end
19
+ def by_url_names(url_names, country_code, product_code_name)
20
+ raise NotImplementedError
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,63 @@
1
+ module Promonizr
2
+ # Campaigns implements CRUD methods on the Campaign resource from the
3
+ # Promotions web service.
4
+ module Contests
5
+ JSON_ATTRIBUTES = %i(images).freeze
6
+
7
+ module_function
8
+
9
+ def api_url
10
+ CoConfig::PROMOTION_API[:url] + '/contests'
11
+ end
12
+
13
+ def all
14
+ @contests = Request.execute(:get, api_url)
15
+ @contests.is_a?(Array) ?@contests : []
16
+ end
17
+
18
+ def create(params)
19
+ Request.execute(:post, api_url, sanitized_params(params))
20
+ end
21
+
22
+ def update(id, params)
23
+ Request.execute(:put, url_with_id(id), sanitized_params(params))
24
+ end
25
+
26
+ def destroy(id)
27
+ Request.execute(:delete, url_with_id(id))
28
+ end
29
+
30
+ def get(id)
31
+ Request.execute(:get, url_with_id(id))
32
+ end
33
+
34
+ def url_with_id(id)
35
+ "#{api_url}/#{id}"
36
+ end
37
+
38
+ def search(params)
39
+ Request.execute(:post, url_with_id('search'), sanitized_params(params))
40
+ end
41
+
42
+ def find_current(params)
43
+ events = search(params)
44
+ events.empty? ? nil : events[0]
45
+ end
46
+
47
+ # Ensures that columns defined in JSON_ATTRIBUTES are json strings.
48
+ # boolean values will be casted
49
+ def sanitized_params(params)
50
+ JSON_ATTRIBUTES.each do |json_column|
51
+ next unless params.key?(json_column)
52
+
53
+ if params[json_column].is_a?(String)
54
+ params[json_column] = JSON.parse(params[json_column])
55
+ end
56
+
57
+ params[json_column] = params[json_column].to_json
58
+ end
59
+
60
+ params
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,4 @@
1
+ module Promonizr
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,41 @@
1
+ module Promonizr
2
+ module Evaluations
3
+ module_function
4
+
5
+ def api_url(rest)
6
+ "#{CoConfig::PROMOTION_API[:url]}/#{rest}"
7
+ end
8
+
9
+ def headers
10
+ {content_type: :json}
11
+ end
12
+
13
+ def evaluate(product, country_code, attributes = {})
14
+ attributes = attributes.with_indifferent_access
15
+
16
+ params = {
17
+ countryCode: country_code,
18
+ product: product,
19
+ form: attributes,
20
+ companyName: attributes[:company_name]
21
+ }.to_json
22
+
23
+ campaigns = Request.execute(:post, api_url('evaluate'), params, headers)
24
+ build_promotions(campaigns)
25
+ end
26
+
27
+ def evaluate_in_bulk(url, form_data, offers_data)
28
+ params = {
29
+ form: form_data,
30
+ offers: offers_data
31
+ }.to_json
32
+ Request.execute(:post, api_url("#{url}/campaigns_for_offers"), params, headers)
33
+ .map { |offer_id, campaigns| [offer_id, build_promotions(campaigns)] }
34
+ .to_h
35
+ end
36
+
37
+ def build_promotions(campaigns)
38
+ campaigns.map { |c| Promotion.new(c) }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,2 @@
1
+ GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ Dir[File.join(GEM_ROOT, 'spec', 'factories', '*.rb')].each { |file| require(file) }