mks_rate 1.0.1

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 (134) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +38 -0
  5. data/app/controllers/mks/rate/application_controller.rb +8 -0
  6. data/app/controllers/mks/rate/chargeable_services_controller.rb +52 -0
  7. data/app/controllers/mks/rate/rate_change_requests_controller.rb +62 -0
  8. data/app/controllers/mks/rate/service_bundles_controller.rb +72 -0
  9. data/app/controllers/mks/rate/service_delivery_units_controller.rb +39 -0
  10. data/app/controllers/mks/rate/service_rates_controller.rb +14 -0
  11. data/app/controllers/mks/rate/service_types_controller.rb +45 -0
  12. data/app/controllers/mks/rate/unit_of_charges_controller.rb +11 -0
  13. data/app/models/mks/rate/application_record.rb +21 -0
  14. data/app/models/mks/rate/chargeable_service.rb +27 -0
  15. data/app/models/mks/rate/chargeable_service_discount.rb +31 -0
  16. data/app/models/mks/rate/rate_change_request.rb +16 -0
  17. data/app/models/mks/rate/service_bundle.rb +14 -0
  18. data/app/models/mks/rate/service_delivery_unit.rb +8 -0
  19. data/app/models/mks/rate/service_rate.rb +17 -0
  20. data/app/models/mks/rate/service_type.rb +7 -0
  21. data/app/models/mks/rate/unit_of_charge.rb +8 -0
  22. data/app/serializers/mks/rate/bundle_discount_serializer.rb +8 -0
  23. data/app/serializers/mks/rate/chargeable_service_serializer.rb +8 -0
  24. data/app/serializers/mks/rate/service_bundle_serializer.rb +7 -0
  25. data/app/serializers/mks/rate/service_rate_serializer.rb +8 -0
  26. data/app/serializers/mks/rate/working_rate_serializer.rb +8 -0
  27. data/app/services/mks/rate/rate_change_request_service.rb +61 -0
  28. data/app/services/mks/rate/service_bundle_service.rb +18 -0
  29. data/config/routes.rb +34 -0
  30. data/db/migrate/20171212165507_create_mks_rate_unit_of_charges.rb +10 -0
  31. data/db/migrate/20171213152154_create_mks_rate_service_delivery_units.rb +11 -0
  32. data/db/migrate/20171213152159_create_mks_rate_service_types.rb +10 -0
  33. data/db/migrate/20171214152030_create_mks_rate_chargeable_services.rb +19 -0
  34. data/db/migrate/20171215092528_create_mks_rate_chargeable_service_discounts.rb +16 -0
  35. data/db/migrate/20171218113530_create_mks_rate_service_rates.rb +15 -0
  36. data/db/migrate/20171219134144_create_mks_rate_service_bundles.rb +15 -0
  37. data/db/migrate/20171220133826_create_mks_rate_rate_change_requests.rb +21 -0
  38. data/db/migrate/20171221110018_create_mks_rate_service_bundles_chargeable_services.rb +12 -0
  39. data/db/seeds.rb +39 -0
  40. data/lib/mks/rate/engine.rb +24 -0
  41. data/lib/mks/rate/version.rb +5 -0
  42. data/lib/mks/rate.rb +4 -0
  43. data/lib/mks_rate.rb +2 -0
  44. data/lib/tasks/mks_rate_tasks.rake +4 -0
  45. data/spec/controllers/mks/rate/chargeable_services_controller_spec.rb +102 -0
  46. data/spec/controllers/mks/rate/rate_change_requests_controller_spec.rb +132 -0
  47. data/spec/controllers/mks/rate/service_bundles_controller_spec.rb +161 -0
  48. data/spec/controllers/mks/rate/service_delivery_units_controller_spec.rb +83 -0
  49. data/spec/controllers/mks/rate/service_rates_controller_spec.rb +34 -0
  50. data/spec/controllers/mks/rate/service_types_controller_spec.rb +103 -0
  51. data/spec/controllers/mks/rate/unit_of_charges_controller_spec.rb +24 -0
  52. data/spec/dummy/Rakefile +6 -0
  53. data/spec/dummy/app/assets/config/manifest.js +5 -0
  54. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  55. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  56. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  57. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  58. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  59. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  60. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  61. data/spec/dummy/app/jobs/application_job.rb +2 -0
  62. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  63. data/spec/dummy/app/models/application_record.rb +3 -0
  64. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  65. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  66. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  67. data/spec/dummy/bin/bundle +3 -0
  68. data/spec/dummy/bin/rails +4 -0
  69. data/spec/dummy/bin/rake +4 -0
  70. data/spec/dummy/bin/setup +34 -0
  71. data/spec/dummy/bin/update +29 -0
  72. data/spec/dummy/config/application.rb +31 -0
  73. data/spec/dummy/config/boot.rb +5 -0
  74. data/spec/dummy/config/cable.yml +9 -0
  75. data/spec/dummy/config/database.yml +25 -0
  76. data/spec/dummy/config/environment.rb +5 -0
  77. data/spec/dummy/config/environments/development.rb +54 -0
  78. data/spec/dummy/config/environments/production.rb +86 -0
  79. data/spec/dummy/config/environments/test.rb +42 -0
  80. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  81. data/spec/dummy/config/initializers/assets.rb +11 -0
  82. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  83. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  84. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  85. data/spec/dummy/config/initializers/inflections.rb +16 -0
  86. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  87. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  88. data/spec/dummy/config/initializers/session_store.rb +3 -0
  89. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/spec/dummy/config/locales/en.yml +23 -0
  91. data/spec/dummy/config/puma.rb +47 -0
  92. data/spec/dummy/config/routes.rb +3 -0
  93. data/spec/dummy/config/secrets.yml +22 -0
  94. data/spec/dummy/config/spring.rb +6 -0
  95. data/spec/dummy/config.ru +5 -0
  96. data/spec/dummy/db/schema.rb +440 -0
  97. data/spec/dummy/log/development.log +16917 -0
  98. data/spec/dummy/log/test.log +58746 -0
  99. data/spec/dummy/public/404.html +67 -0
  100. data/spec/dummy/public/422.html +67 -0
  101. data/spec/dummy/public/500.html +66 -0
  102. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  103. data/spec/dummy/public/apple-touch-icon.png +0 -0
  104. data/spec/dummy/public/favicon.ico +0 -0
  105. data/spec/factories/application_modules.rb +6 -0
  106. data/spec/factories/chargeable_service.rb +10 -0
  107. data/spec/factories/equipment_categories.rb +8 -0
  108. data/spec/factories/equipment_items.rb +14 -0
  109. data/spec/factories/equipment_locations.rb +9 -0
  110. data/spec/factories/equipment_types.rb +7 -0
  111. data/spec/factories/equipments.rb +9 -0
  112. data/spec/factories/location_types.rb +7 -0
  113. data/spec/factories/menus.rb +10 -0
  114. data/spec/factories/rate_change_requests.rb +15 -0
  115. data/spec/factories/service_bundles.rb +9 -0
  116. data/spec/factories/service_delivery_units.rb +7 -0
  117. data/spec/factories/service_rate.rb +8 -0
  118. data/spec/factories/service_types.rb +6 -0
  119. data/spec/factories/unit_of_charges.rb +6 -0
  120. data/spec/factories/user_roles.rb +18 -0
  121. data/spec/factories/users.rb +27 -0
  122. data/spec/models/mks/rate/chargeable_service_spec.rb +41 -0
  123. data/spec/models/mks/rate/rate_change_request_spec.rb +44 -0
  124. data/spec/models/mks/rate/service_bundle_spec.rb +28 -0
  125. data/spec/models/mks/rate/service_delivery_unit_spec.rb +24 -0
  126. data/spec/models/mks/rate/service_rate_spec.rb +21 -0
  127. data/spec/models/mks/rate/service_type_spec.rb +29 -0
  128. data/spec/models/mks/rate/unit_of_charge_spec.rb +24 -0
  129. data/spec/rails_helper.rb +57 -0
  130. data/spec/services/mks/rate/rate_change_request_service_spec.rb +53 -0
  131. data/spec/services/mks/rate/service_bundle_service_spec.rb +58 -0
  132. data/spec/spec_helper.rb +108 -0
  133. data/spec/support/factory_bot.rb +5 -0
  134. metadata +405 -0
@@ -0,0 +1,61 @@
1
+ module Mks
2
+ module Rate
3
+ class RateChangeRequestService
4
+ def create(params, created_by)
5
+ change_request = RateChangeRequest.new(params)
6
+
7
+ unless params[:rates]
8
+ change_request.errors.add(:base, 'Request has no rates')
9
+ return [change_request, false]
10
+ end
11
+
12
+ change_request.created_by = created_by
13
+ change_request.status = 'SUBMITTED'
14
+ begin
15
+ RateChangeRequest.transaction do
16
+ change_request.save!
17
+ return [change_request, true]
18
+ end
19
+ rescue => _
20
+ return [change_request, false]
21
+ end
22
+ end
23
+
24
+
25
+ def approve(request, approver)
26
+ if update_rates(request.rates)
27
+ request.status = 'APPROVED'
28
+ request.approved_by = approver
29
+ return request.save
30
+ end
31
+ false
32
+ end
33
+
34
+ def update_rates(rates)
35
+ service_rates = []
36
+ rates.each do |rate|
37
+ rate = rate.symbolize_keys
38
+ service_rate = ServiceRate.find_by(chargeable_service_id: rate[:chargeable_service_id],
39
+ equipment_item_id: rate[:equipment_item_id])
40
+ if service_rate
41
+ service_rate.base_rate = rate[:base_rate] || service_rate.base_rate
42
+ service_rate.utilization_rate = rate[:utilization_rate] || service_rate.utilization_rate
43
+ else
44
+ service_rate = ServiceRate.new(rate.except(:chargeable_service_name, :equipment_item_name))
45
+ end
46
+ service_rates << service_rate
47
+ end
48
+
49
+ ServiceRate.transaction do
50
+ service_rates.each(&:save!)
51
+ end
52
+ true
53
+ rescue ActiveRecord::RecordInvalid
54
+ false
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+
61
+
@@ -0,0 +1,18 @@
1
+ module Mks
2
+ module Rate
3
+ class ServiceBundleService
4
+ def add_services(bundle, ids)
5
+ selected_services = Mks::Rate::ChargeableService.where(id: ids)
6
+
7
+ ServiceBundle.transaction do
8
+ new_services = selected_services - bundle.chargeable_services
9
+ removable_services = bundle.chargeable_services - selected_services
10
+ bundle.chargeable_services.delete(removable_services)
11
+ bundle.chargeable_services << new_services
12
+ return true
13
+ end
14
+ false
15
+ end
16
+ end
17
+ end
18
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,34 @@
1
+ Mks::Rate::Engine.routes.draw do
2
+ resources :rate_change_requests do
3
+ member do
4
+ get 'approve', controller: :rate_change_requests, action: :approve
5
+ end
6
+ end
7
+
8
+ resources :service_bundles do
9
+ member do
10
+ get 'discounts', controller: :bundle_discounts, action: :index
11
+ get 'services', controller: :service_bundles, action: :services
12
+ post 'services', controller: :service_bundles, action: :add_services
13
+ end
14
+ end
15
+ resources :service_types
16
+ resources :service_delivery_units do
17
+ member do
18
+ get 'services', controller: :chargeable_services, action: :sdu_services
19
+ get 'bundles', controller: :service_bundles, action: :sdu_bundles
20
+ end
21
+ end
22
+ resources :chargeable_services, only: [:index, :create, :update]
23
+ get 'chargeable_services/filter', controller: :chargeable_services, action: :filter
24
+ resources :unit_of_charges
25
+ resources :service_rate_settings do
26
+ member do
27
+ post 'change_status', controller: :service_rate_settings, action: :change_status
28
+ end
29
+ end
30
+ resources :service_rates, only: [:index]
31
+ get '/service_rates/working_rates', controller: :service_rates, action: :working_rates
32
+ resources :bundle_discounts
33
+ get '/filtered_bundles', controller: :service_bundles, action: :filter
34
+ end
@@ -0,0 +1,10 @@
1
+ class CreateMksRateUnitOfCharges < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_unit_of_charges do |t|
4
+ t.string :name, null: false
5
+ t.json :unit_variables, null: false
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateMksRateServiceDeliveryUnits < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_service_delivery_units do |t|
4
+ t.string :code, null: false, unique: true
5
+ t.string :name, null: false
6
+ t.string :address, null: false
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class CreateMksRateServiceTypes < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_service_types do |t|
4
+ t.string :code, unique: true
5
+ t.string :name, unique: true
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ class CreateMksRateChargeableServices < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_chargeable_services do |t|
4
+ t.string :code, null: false
5
+ t.string :name, null: false
6
+ t.integer :service_type_id, index: { name: 'st_on_cs_indx' }
7
+ t.integer :base_unit_id, index: {name: 'bu_on_cs_indx' }
8
+ t.integer :utilization_unit_id, index: { name: 'uu_on_cs_indx' }
9
+ t.integer :service_delivery_unit_id, index: { name: 'sdu_on_cs_indx' }
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ add_foreign_key :mks_rate_chargeable_services, :mks_rate_service_types, column: :service_type_id
15
+ add_foreign_key :mks_rate_chargeable_services, :mks_rate_unit_of_charges, column: :base_unit_id
16
+ add_foreign_key :mks_rate_chargeable_services, :mks_rate_unit_of_charges, column: :utilization_unit_id
17
+ add_foreign_key :mks_rate_chargeable_services, :mks_rate_service_delivery_units, column: :service_delivery_unit_id
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ class CreateMksRateChargeableServiceDiscounts < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_chargeable_service_discounts do |t|
4
+ t.string :unit_variable, null: false
5
+ t.float :from, null: false
6
+ t.float :to, null: false
7
+ t.float :value, null: false
8
+ t.integer :chargeable_service_id
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_foreign_key :mks_rate_chargeable_service_discounts,
14
+ :mks_rate_chargeable_services, column: :chargeable_service_id
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ class CreateMksRateServiceRates < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_service_rates do |t|
4
+ t.references :chargeable_service, index: { name: 'cs_on_sr_indx' }
5
+ t.references :equipment_item, index: { name: 'cs_on_ei_indx' }
6
+ t.float :base_rate, default: 0
7
+ t.float :utilization_rate, default: 0
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ add_foreign_key :mks_rate_service_rates, :mks_rate_chargeable_services, column: :chargeable_service_id
13
+ add_foreign_key :mks_rate_service_rates, :mks_edm_equipment_items, column: :equipment_item_id
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class CreateMksRateServiceBundles < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_service_bundles do |t|
4
+ t.string :code, unique: true
5
+ t.string :name, null: false
6
+ t.string :description
7
+ t.float :percent_discount, null: false, default: 0
8
+ t.references :service_delivery_unit, index: { name: 'sdu_on_sb_indx' }
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_foreign_key :mks_rate_service_bundles, :mks_rate_service_delivery_units, column: :service_delivery_unit_id
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class CreateMksRateRateChangeRequests < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_rate_change_requests do |t|
4
+ t.string :reference_number, unique: true
5
+ t.string :authorized_by, null: false
6
+ t.date :effective_on, null: false
7
+ t.date :authorized_on, null: false
8
+ t.json :rates, null: false
9
+ t.string :status, null: false, default: 'SUBMITTED'
10
+ t.references :created_by, index: { name: 'cb_on_rcr_indx' }
11
+ t.references :approved_by, index: { name: 'ab_on_rcr_indx' }
12
+ t.string :remark
13
+
14
+ t.timestamps
15
+ end
16
+
17
+ add_index :mks_rate_rate_change_requests, :reference_number, unique: true
18
+ add_foreign_key :mks_rate_rate_change_requests, :mks_auth_users, column: :created_by_id
19
+ add_foreign_key :mks_rate_rate_change_requests, :mks_auth_users, column: :approved_by_id
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ class CreateMksRateServiceBundlesChargeableServices < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :mks_rate_service_bundles_chargeable_services, id: false do |t|
4
+ t.references :service_bundle, index: false
5
+ t.references :chargeable_service, index: false
6
+ end
7
+
8
+ add_index :mks_rate_service_bundles_chargeable_services, %i[service_bundle_id chargeable_service_id], name: 'sb_on_cs_indx'
9
+ add_foreign_key :mks_rate_service_bundles_chargeable_services, :mks_rate_service_bundles, column: :service_bundle_id
10
+ add_foreign_key :mks_rate_service_bundles_chargeable_services, :mks_rate_chargeable_services, column: :chargeable_service_id
11
+ end
12
+ end
data/db/seeds.rb ADDED
@@ -0,0 +1,39 @@
1
+ Mks::Rate::UnitOfCharge.create(name: 'M2/Day', unit_variables: JSON({ Meter: 'number', Day: 'number' }))
2
+ Mks::Rate::UnitOfCharge.create(name: 'M3/Hr', unit_variables: JSON({Meter: 'number', Hour: 'number'}))
3
+
4
+ app_module = Mks::Auth::ApplicationModule.where(code: 'RMM', name: 'Rate Management Module').first_or_create
5
+ rate_owner = Mks::Auth::UserRole.where(name: 'RATE_OWNER', application_module_id: app_module.id).first_or_create
6
+ rate_staff = Mks::Auth::UserRole.where(name: 'RATE_STAFF', application_module_id: app_module.id).first_or_create
7
+
8
+ menu1 = Mks::Auth::Menu.where(text: 'Service Definition', icon_cls: 'fa-calendar', application_module_id: app_module.id).first_or_create
9
+ menu5 = Mks::Auth::Menu.where(text: 'Rate Definition', application_module_id: app_module.id).first_or_create
10
+
11
+ Mks::Auth::Menu.where(text: 'Service Delivery Unit', parent_id: menu1.id, location: 'service-delivery-units',
12
+ icon_cls: 'fa-list', application_module_id: app_module.id).first_or_create
13
+ Mks::Auth::Menu.where(text: 'Service Bundle', parent_id: menu1.id, location: 'service-bundles',
14
+ icon_cls: 'fa-clone', application_module_id: app_module.id).first_or_create
15
+ Mks::Auth::Menu.where(text: 'Chargeable Service', parent_id: menu1.id, location: 'chargeable-services',
16
+ icon_cls: 'fa-list-alt', application_module_id: app_module.id).first_or_create
17
+ m = Mks::Auth::Menu.where(text: 'Rate Change Request', parent_id: menu5.id, location: 'rate-change-requests',
18
+ icon_cls: 'fa-stack-exchange', application_module_id: app_module.id).first_or_create
19
+ m1 = Mks::Auth::Menu.where(text: 'Working Rates', parent_id: menu5.id, location: 'working-rates',
20
+ icon_cls: 'fa-stack-exchange', application_module_id: app_module.id).first_or_create
21
+ rate_owner_menu = rate_owner.menus.where(application_module_id: app_module.id)
22
+ rate_owner.menus.delete(rate_owner_menu)
23
+ rate_owner.menus << menu5
24
+ rate_owner.menus << menu5.children
25
+
26
+ rate_staff_menu = rate_staff.menus.where(application_module_id: app_module.id)
27
+ rate_staff.menus.delete(rate_staff_menu)
28
+ rate_staff.menus << menu1
29
+ rate_staff.menus << menu1.children
30
+ rate_staff.menus << m
31
+
32
+ u3 = Mks::Auth::User.where(first_name: 'Bisrat', last_name: 'R.')
33
+ if u3.empty?
34
+ u3 = Mks::Auth::User.create(first_name: 'Bisrat', last_name: 'R.', email: 'bisrat@gmail.com', active: true,
35
+ application_modules: [app_module], password: 'bisrat123')
36
+ u3.roles << rate_owner
37
+ u3.roles << rate_staff
38
+ end
39
+
@@ -0,0 +1,24 @@
1
+ module Mks
2
+ module Rate
3
+ class Engine < ::Rails::Engine
4
+ require 'active_model_serializers'
5
+ isolate_namespace Mks::Rate
6
+ config.generators.api_only = true
7
+
8
+ initializer :append_migrations do |app|
9
+ unless app.root.to_s.match? root.to_s
10
+ config.paths['db/migrate'].expanded.each do |expanded_path|
11
+ app.config.paths['db/migrate'] << expanded_path
12
+ end
13
+ end
14
+ end
15
+
16
+ config.generators do |g|
17
+ g.test_framework :rspec, fixtures: true, routing_specs: false, helper_specs: false
18
+ g.assets false
19
+ g.helper false
20
+ g.fixture_replacement :factory_bot, dir: 'spec/factories'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ module Mks
2
+ module Rate
3
+ VERSION = '1.0.1'.freeze
4
+ end
5
+ end
data/lib/mks/rate.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Mks
2
+ module Rate
3
+ end
4
+ end
data/lib/mks_rate.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'mks/rate'
2
+ require 'mks/rate/engine'
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :mks_rate do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,102 @@
1
+ require 'rails_helper'
2
+
3
+ module Mks
4
+ module Rate
5
+ RSpec.describe ChargeableServicesController, type: :controller do
6
+ routes { Mks::Rate::Engine.routes }
7
+
8
+ before(:each) do
9
+ u = create(:user)
10
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
11
+ request.headers['Authorization'] = "Bearer #{token}"
12
+ end
13
+
14
+ let(:valid_attributes) {
15
+ {
16
+ code: FFaker::Name.unique.name,
17
+ name: FFaker::Name.name,
18
+ base_unit_id: create(:unit_of_charge).id,
19
+ utilization_unit_id: create(:unit_of_charge).id,
20
+ service_delivery_unit_id: create(:service_delivery_unit).id,
21
+ service_type_id: create(:service_type).id
22
+ }
23
+ }
24
+
25
+ let(:invalid_attributes) {
26
+ {
27
+ code: nil,
28
+ name: FFaker::Name.name,
29
+ base_unit_id: create(:unit_of_charge).id,
30
+ utilization_unit_id: create(:unit_of_charge).id,
31
+ service_delivery_unit_id: create(:service_delivery_unit).id,
32
+ service_type_id: create(:service_type).id
33
+ }
34
+ }
35
+
36
+ describe 'GET #index' do
37
+ it 'returns all chargeable services' do
38
+ 3.times { create(:chargeable_service) }
39
+ get :index
40
+ data = JSON(response.body)
41
+ expect(data.count).to eq(3)
42
+ expect(data[0].count).to eq(11)
43
+ end
44
+ end
45
+
46
+ describe 'POST #create' do
47
+ context 'with valid data' do
48
+ it 'saves chargeable service' do
49
+ expect {
50
+ post :create, params: { chargeable_service: valid_attributes }, format: :json
51
+ }.to change(ChargeableService, :count).by(1)
52
+ end
53
+
54
+ it 'returns a success message' do
55
+ post :create, params: { chargeable_service: valid_attributes }, format: :json
56
+ result = JSON(response.body)
57
+ expect(result['message']).to eq('Chargeable service saved successfully !')
58
+ end
59
+ end
60
+
61
+ context 'with invalid data' do
62
+ it 'returns error message(s)' do
63
+ post :create, params: { chargeable_service: invalid_attributes }, format: :json
64
+ result = JSON(response.body)
65
+ expect(result['code'].count).to be > 0
66
+ end
67
+ end
68
+ end
69
+
70
+ describe 'PUT #update' do
71
+ context 'with valid data' do
72
+ it 'updates chargeable service ' do
73
+ cs = create(:chargeable_service)
74
+ put :update, params: { id: cs.id, chargeable_service: { name: 'Chargeable service 1' } }, format: :json
75
+ cs.reload
76
+ expect(cs.name).to eq 'Chargeable service 1'
77
+ end
78
+ end
79
+ context 'with invalid data' do
80
+ it 'returns an error message' do
81
+ cs = create(:chargeable_service)
82
+ put :update, params: { id: cs.id, chargeable_service: { name: nil } }, format: :json
83
+ result = JSON(response.body)
84
+ expect(result['name'].count).to be > 0
85
+ end
86
+ end
87
+ end
88
+
89
+ describe 'GET #sdu_service' do
90
+ it 'returns services under a given service delivery unit' do
91
+ sdu1 = create(:service_delivery_unit)
92
+ sdu2 = create(:service_delivery_unit)
93
+ 2.times { create(:chargeable_service, service_delivery_unit_id: sdu1.id) }
94
+ 2.times { create(:chargeable_service, service_delivery_unit_id: sdu2.id) }
95
+ get :sdu_services, params: { id: sdu1.id }, format: :json
96
+ data = JSON(response.body)
97
+ expect(data.count).to eq(2)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,132 @@
1
+ require 'rails_helper'
2
+
3
+ module Mks
4
+ module Rate
5
+ RSpec.describe RateChangeRequestsController, type: :controller do
6
+ routes { Mks::Rate::Engine.routes }
7
+
8
+ before(:each) do
9
+ u = create(:user)
10
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
11
+ request.headers['Authorization'] = "Bearer #{token}"
12
+ end
13
+
14
+ let(:valid_attributes) do
15
+ {
16
+ reference_number: FFaker::Name.name,
17
+ authorized_by: FFaker::Name.name,
18
+ effective_on: Date.today,
19
+ authorized_on: Date.today,
20
+ rates: [
21
+ {
22
+ chargeable_service_id: create(:chargeable_service).id,
23
+ chargeable_service_name: create(:chargeable_service).name,
24
+ equipment_item_id: create(:equipment_item).id,
25
+ equipment_item_name: create(:equipment_item).name,
26
+ base_rate: 10,
27
+ utilization_rate: 20
28
+ }
29
+ ],
30
+ status: RateChangeRequest::SUBMITTED,
31
+ created_by_id: create(:user).id,
32
+ approved_by_id: create(:user).id
33
+ }
34
+ end
35
+
36
+ let(:invalid_attributes) do
37
+ {
38
+ reference_number: nil,
39
+ authorized_by: FFaker::Name.name,
40
+ effective_on: Date.today,
41
+ authorized_on: Date.today,
42
+ rates: [
43
+ {
44
+ chargeable_service_id: create(:chargeable_service).id,
45
+ chargeable_service_name: create(:chargeable_service).name,
46
+ equipment_item_id: create(:equipment_item).id,
47
+ equipment_item_name: create(:equipment_item).name,
48
+ base_rate: 10,
49
+ utilization_rate: 20
50
+ }
51
+ ],
52
+ status: RateChangeRequest::SUBMITTED,
53
+ created_by_id: create(:user).id,
54
+ approved_by_id: create(:user).id
55
+ }
56
+ end
57
+
58
+ describe 'GET #index' do
59
+ it 'returns a success response' do
60
+ create(:rate_change_request)
61
+ get :index
62
+ expect(response).to be_successful
63
+ end
64
+ end
65
+
66
+ describe 'GET #show' do
67
+ it 'returns a success response' do
68
+ rate_change_request = create(:rate_change_request)
69
+ get :show, params: { id: rate_change_request.to_param }
70
+ expect(response).to be_successful
71
+ end
72
+ end
73
+
74
+ describe 'POST #create' do
75
+ context 'with valid params' do
76
+ it 'creates a new RateChangeRequest' do
77
+ expect do
78
+ post :create, params: { rate_change_request: valid_attributes }
79
+ end.to change(RateChangeRequest, :count).by(1)
80
+ end
81
+
82
+ it 'renders a JSON response with the new rate_change_request' do
83
+ post :create, params: { rate_change_request: valid_attributes }
84
+ expect(response).to have_http_status(:created)
85
+ expect(response.content_type).to eq('application/json')
86
+ end
87
+ end
88
+
89
+ context 'with invalid params' do
90
+ it 'renders a JSON response with errors for the new rate_change_request' do
91
+ post :create, params: { rate_change_request: invalid_attributes }
92
+ expect(response).to have_http_status(:unprocessable_entity)
93
+ expect(response.content_type).to eq('application/json')
94
+ end
95
+ end
96
+ end
97
+
98
+ describe 'PUT #update' do
99
+ context 'with valid params' do
100
+ let(:new_attributes) do
101
+ {
102
+ authorized_by: FFaker::Name.name
103
+ }
104
+ end
105
+
106
+ it 'updates the requested rate_change_request' do
107
+ rate_change_request = create(:rate_change_request)
108
+ put :update, params: { id: rate_change_request.to_param, rate_change_request: new_attributes }
109
+ rate_change_request.reload
110
+ expect(rate_change_request.authorized_by).to eq new_attributes[:authorized_by]
111
+ end
112
+
113
+ it 'renders a JSON response with the rate_change_request' do
114
+ rate_change_request = create(:rate_change_request)
115
+ put :update, params: { id: rate_change_request.to_param, rate_change_request: valid_attributes }
116
+ expect(response).to have_http_status(:ok)
117
+ expect(response.content_type).to eq('application/json')
118
+ end
119
+ end
120
+
121
+ context 'with invalid params' do
122
+ it 'renders a JSON response with errors for the rate_change_request' do
123
+ rate_change_request = create(:rate_change_request)
124
+ put :update, params: { id: rate_change_request.to_param, rate_change_request: invalid_attributes }
125
+ expect(response).to have_http_status(:unprocessable_entity)
126
+ expect(response.content_type).to eq('application/json')
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end