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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +38 -0
- data/app/controllers/mks/rate/application_controller.rb +8 -0
- data/app/controllers/mks/rate/chargeable_services_controller.rb +52 -0
- data/app/controllers/mks/rate/rate_change_requests_controller.rb +62 -0
- data/app/controllers/mks/rate/service_bundles_controller.rb +72 -0
- data/app/controllers/mks/rate/service_delivery_units_controller.rb +39 -0
- data/app/controllers/mks/rate/service_rates_controller.rb +14 -0
- data/app/controllers/mks/rate/service_types_controller.rb +45 -0
- data/app/controllers/mks/rate/unit_of_charges_controller.rb +11 -0
- data/app/models/mks/rate/application_record.rb +21 -0
- data/app/models/mks/rate/chargeable_service.rb +27 -0
- data/app/models/mks/rate/chargeable_service_discount.rb +31 -0
- data/app/models/mks/rate/rate_change_request.rb +16 -0
- data/app/models/mks/rate/service_bundle.rb +14 -0
- data/app/models/mks/rate/service_delivery_unit.rb +8 -0
- data/app/models/mks/rate/service_rate.rb +17 -0
- data/app/models/mks/rate/service_type.rb +7 -0
- data/app/models/mks/rate/unit_of_charge.rb +8 -0
- data/app/serializers/mks/rate/bundle_discount_serializer.rb +8 -0
- data/app/serializers/mks/rate/chargeable_service_serializer.rb +8 -0
- data/app/serializers/mks/rate/service_bundle_serializer.rb +7 -0
- data/app/serializers/mks/rate/service_rate_serializer.rb +8 -0
- data/app/serializers/mks/rate/working_rate_serializer.rb +8 -0
- data/app/services/mks/rate/rate_change_request_service.rb +61 -0
- data/app/services/mks/rate/service_bundle_service.rb +18 -0
- data/config/routes.rb +34 -0
- data/db/migrate/20171212165507_create_mks_rate_unit_of_charges.rb +10 -0
- data/db/migrate/20171213152154_create_mks_rate_service_delivery_units.rb +11 -0
- data/db/migrate/20171213152159_create_mks_rate_service_types.rb +10 -0
- data/db/migrate/20171214152030_create_mks_rate_chargeable_services.rb +19 -0
- data/db/migrate/20171215092528_create_mks_rate_chargeable_service_discounts.rb +16 -0
- data/db/migrate/20171218113530_create_mks_rate_service_rates.rb +15 -0
- data/db/migrate/20171219134144_create_mks_rate_service_bundles.rb +15 -0
- data/db/migrate/20171220133826_create_mks_rate_rate_change_requests.rb +21 -0
- data/db/migrate/20171221110018_create_mks_rate_service_bundles_chargeable_services.rb +12 -0
- data/db/seeds.rb +39 -0
- data/lib/mks/rate/engine.rb +24 -0
- data/lib/mks/rate/version.rb +5 -0
- data/lib/mks/rate.rb +4 -0
- data/lib/mks_rate.rb +2 -0
- data/lib/tasks/mks_rate_tasks.rake +4 -0
- data/spec/controllers/mks/rate/chargeable_services_controller_spec.rb +102 -0
- data/spec/controllers/mks/rate/rate_change_requests_controller_spec.rb +132 -0
- data/spec/controllers/mks/rate/service_bundles_controller_spec.rb +161 -0
- data/spec/controllers/mks/rate/service_delivery_units_controller_spec.rb +83 -0
- data/spec/controllers/mks/rate/service_rates_controller_spec.rb +34 -0
- data/spec/controllers/mks/rate/service_types_controller_spec.rb +103 -0
- data/spec/controllers/mks/rate/unit_of_charges_controller_spec.rb +24 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +34 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/config/application.rb +31 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +9 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +86 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/puma.rb +47 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/db/schema.rb +440 -0
- data/spec/dummy/log/development.log +16917 -0
- data/spec/dummy/log/test.log +58746 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/application_modules.rb +6 -0
- data/spec/factories/chargeable_service.rb +10 -0
- data/spec/factories/equipment_categories.rb +8 -0
- data/spec/factories/equipment_items.rb +14 -0
- data/spec/factories/equipment_locations.rb +9 -0
- data/spec/factories/equipment_types.rb +7 -0
- data/spec/factories/equipments.rb +9 -0
- data/spec/factories/location_types.rb +7 -0
- data/spec/factories/menus.rb +10 -0
- data/spec/factories/rate_change_requests.rb +15 -0
- data/spec/factories/service_bundles.rb +9 -0
- data/spec/factories/service_delivery_units.rb +7 -0
- data/spec/factories/service_rate.rb +8 -0
- data/spec/factories/service_types.rb +6 -0
- data/spec/factories/unit_of_charges.rb +6 -0
- data/spec/factories/user_roles.rb +18 -0
- data/spec/factories/users.rb +27 -0
- data/spec/models/mks/rate/chargeable_service_spec.rb +41 -0
- data/spec/models/mks/rate/rate_change_request_spec.rb +44 -0
- data/spec/models/mks/rate/service_bundle_spec.rb +28 -0
- data/spec/models/mks/rate/service_delivery_unit_spec.rb +24 -0
- data/spec/models/mks/rate/service_rate_spec.rb +21 -0
- data/spec/models/mks/rate/service_type_spec.rb +29 -0
- data/spec/models/mks/rate/unit_of_charge_spec.rb +24 -0
- data/spec/rails_helper.rb +57 -0
- data/spec/services/mks/rate/rate_change_request_service_spec.rb +53 -0
- data/spec/services/mks/rate/service_bundle_service_spec.rb +58 -0
- data/spec/spec_helper.rb +108 -0
- data/spec/support/factory_bot.rb +5 -0
- 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,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,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
|
data/lib/mks/rate.rb
ADDED
data/lib/mks_rate.rb
ADDED
@@ -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
|