cats_core 1.4.22 → 1.4.23

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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/cats/core/dispatch_authorizations_controller.rb +10 -2
  3. data/app/controllers/cats/core/dispatches_controller.rb +5 -0
  4. data/app/controllers/cats/core/lost_commodities_controller.rb +2 -2
  5. data/app/controllers/cats/core/receipt_authorizations_controller.rb +1 -2
  6. data/app/controllers/cats/core/receipts_controller.rb +19 -0
  7. data/app/models/cats/core/authorization.rb +15 -3
  8. data/app/models/cats/core/dispatch.rb +11 -8
  9. data/app/models/cats/core/lost_commodity.rb +2 -3
  10. data/app/models/cats/core/receipt.rb +10 -0
  11. data/app/models/cats/core/receipt_authorization.rb +4 -8
  12. data/app/models/cats/core/receipt_transaction.rb +1 -0
  13. data/app/serializers/cats/core/dispatch_authorization_serializer.rb +1 -1
  14. data/app/serializers/cats/core/lost_commodity_serializer.rb +1 -1
  15. data/app/serializers/cats/core/receipt_authorization_serializer.rb +2 -2
  16. data/app/serializers/cats/core/receipt_serializer.rb +1 -2
  17. data/app/serializers/cats/core/receipt_transaction_serializer.rb +1 -5
  18. data/app/services/cats/core/authorization_service.rb +25 -0
  19. data/config/routes.rb +10 -1
  20. data/db/migrate/20210727074646_create_cats_core_receipt_authorizations.rb +1 -1
  21. data/db/migrate/20210727105834_create_cats_core_receipts.rb +15 -0
  22. data/db/migrate/20210728041505_create_cats_core_lost_commodities.rb +3 -4
  23. data/lib/cats/core/version.rb +1 -1
  24. data/spec/factories/cats/core/dispatches.rb +16 -0
  25. data/spec/factories/cats/core/lost_commodities.rb +1 -2
  26. data/spec/factories/cats/core/receipt_authorizations.rb +13 -7
  27. data/spec/factories/cats/core/receipts.rb +8 -0
  28. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3a896be87ee316cd08b40a298effac694bfb59e1207699c50675b4242e0f630
4
- data.tar.gz: 3b6d584ce3eacbf6a0f3ffda03c399d84db2c5bf3931666107cf9d7fd014e3ca
3
+ metadata.gz: 3c58aa13420d9d6df2e5954237e8d8fbfef4db3d620636a49bba9ba2c6d30eb2
4
+ data.tar.gz: 6ff8e9bc22538cef900ed1e4ef1d80620699f5b94df2bbf8771f37cf4b0367b1
5
5
  SHA512:
6
- metadata.gz: 234470131214a8e68da2123957a811c55c41c38079c34ec9dde9b9313c0d85c7b88607da5b0a3d7a2dd98f1c2f39942f5790a858d21eb76595a9f0572578d3a5
7
- data.tar.gz: 4f3e4040eff76a430bbcaf24ec3bae51dc54905831f744f23802905c4d6df80cc440184de47c9398be98051be81519010cf4ca9e3818817a3b1fc67b9cd3dda8
6
+ metadata.gz: caf7a1b4209a0405e22dbf86736424ce82f577ded281348911faed27a1cbc9e232c35eea14cdb768d2655aaa8dcce9fda5362ac3c60ec088b13522a191eeabbc
7
+ data.tar.gz: 2992ab176cd20d2e82a56ac9fc178d5aa06cc8870aa67c5c545f42804c9d31dc082203ef5cdebae968b69aee147689056d06401cffe35f4d566d0c5026bf470c
@@ -10,13 +10,21 @@ module Cats
10
10
  end
11
11
 
12
12
  def confirm
13
- authorization = DispatchAuthorization.find(params[:id])
14
- authorization.confirm
13
+ service = AuthorizationService.new
14
+ authorization = service.confirm(params[:id])
15
15
  render json: { success: true, data: serialize(authorization) }
16
16
  rescue StandardError => e
17
17
  render json: { success: false, error: e.message }
18
18
  end
19
19
 
20
+ def storekeeper_authorizations
21
+ storekeeper = User.find(params[:id])
22
+ stores = storekeeper.stores
23
+ authorizations = DispatchAuthorization.joins(:dispatch)
24
+ .where(store: stores, dispatch: { dispatch_status: Dispatch::APPROVED })
25
+ render json: { success: true, data: serialize(authorizations) }
26
+ end
27
+
20
28
  private
21
29
 
22
30
  def model_params
@@ -43,6 +43,11 @@ module Cats
43
43
  render json: { success: false, error: e.message }
44
44
  end
45
45
 
46
+ def filter
47
+ query = Dispatch.ransack(params[:q])
48
+ render json: { success: true, data: serialize(query.result) }
49
+ end
50
+
46
51
  def search
47
52
  data = @service.search(current_user, params[:status])
48
53
  render json: { success: true, data: serialize(data) }
@@ -5,12 +5,12 @@ module Cats
5
5
 
6
6
  def index
7
7
  super do
8
- LostCommodity.where(dispatch_id: params[:id])
8
+ LostCommodity.where(receipt_authorization_id: params[:id])
9
9
  end
10
10
  end
11
11
 
12
12
  def model_params
13
- params.require(:payload).permit(:dispatch_id, :quantity, :commodity_status, :remark)
13
+ params.require(:payload).permit(:receipt_authorization_id, :quantity, :remark)
14
14
  end
15
15
  end
16
16
  end
@@ -20,8 +20,7 @@ module Cats
20
20
  private
21
21
 
22
22
  def model_params
23
- params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :lost_quantity, :remark, :status,
24
- :authorized_by_id)
23
+ params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :remark, :status, :authorized_by_id)
25
24
  end
26
25
  end
27
26
  end
@@ -0,0 +1,19 @@
1
+ module Cats
2
+ module Core
3
+ class ReceiptsController < ApplicationController
4
+ include Common
5
+
6
+ def index
7
+ super do
8
+ Receipt.where(receipt_authorization_id: params[:id])
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def model_params
15
+ params.require(:payload).permit(:receipt_authorization_id, :commodity_status, :quantity, :remark)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -20,6 +20,9 @@ module Cats
20
20
  delegate(:full_name, to: :authorized_by, prefix: :authorizer)
21
21
  delegate(:name, to: :store, prefix: true)
22
22
  delegate(:reference_no, to: :dispatch, prefix: true)
23
+ delegate(:dispatch_status, to: :dispatch)
24
+ delegate(:plate_no, to: :dispatch)
25
+ delegate(:driver_name, to: :dispatch)
23
26
 
24
27
  def validate_dispatch_status
25
28
  return unless dispatch
@@ -42,12 +45,21 @@ module Cats
42
45
  end
43
46
 
44
47
  def confirm
45
- # Check if all transactions are committed first.
46
48
  if instance_of?(DispatchAuthorization)
47
49
  raise(StandardError, 'Authorization does not have transactions.') if transactions.blank?
48
50
 
49
- count = transactions.where(status: Transaction::DRAFT).count
50
- raise(StandardError, 'There are uncommitted transactions.') if count.positive?
51
+ transactions.each(&:commit)
52
+ # count = transactions.where(status: Transaction::DRAFT).count
53
+ # raise(StandardError, 'There are uncommitted transactions.') if count.positive?
54
+ elsif instance_of?(ReceiptAuthorization)
55
+ raise(StandardError, 'Authorization does not have receipts.') unless receipts.count.positive?
56
+
57
+ total_received = receipts.sum(:quantity)
58
+ total_lost = lost_commodities.sum(:quantity)
59
+ diff = quantity - (total_received + total_lost)
60
+ raise(StandardError, "A quantity of #{diff} is unaccounted for.") unless diff.zero?
61
+
62
+ self.received_quantity = total_received
51
63
  end
52
64
  self.status = CONFIRMED
53
65
  save!
@@ -3,12 +3,13 @@ module Cats
3
3
  class Dispatch < ApplicationRecord
4
4
  DRAFT = 'Draft'.freeze
5
5
  APPROVED = 'Approved'.freeze
6
+ READY_TO_START = 'Ready to Start'.freeze
6
7
  STARTED = 'Started'.freeze
7
8
  ARRIVED = 'Arrived'.freeze
8
9
  UNLOADED = 'Unloaded'.freeze
9
10
  RECEIVED = 'Received'.freeze
10
11
 
11
- DISPATCH_STATUSES = [DRAFT, APPROVED, STARTED, ARRIVED, UNLOADED, RECEIVED].freeze
12
+ DISPATCH_STATUSES = [DRAFT, APPROVED, READY_TO_START, STARTED, ARRIVED, UNLOADED, RECEIVED].freeze
12
13
 
13
14
  belongs_to :prepared_by, class_name: 'Cats::Core::User'
14
15
  belongs_to :transporter
@@ -60,14 +61,16 @@ module Cats
60
61
  save!
61
62
  end
62
63
 
64
+ def all_authorizations_confirmed?
65
+ statuses = dispatch_authorizations.map(&:status).uniq
66
+ return true if statuses.length == 1 && statuses[0] == Authorization::CONFIRMED
67
+
68
+ false
69
+ end
70
+
63
71
  def start
64
- Dispatch.transaction do
65
- # Commit transactions
66
- self.quantity = dispatch_transactions.sum(:quantity)
67
- self.dispatch_status = STARTED
68
- save!
69
- dispatch_transactions.each(&:commit)
70
- end
72
+ self.dispatch_status = STARTED
73
+ save!
71
74
  end
72
75
 
73
76
  def self.search_commodity(batch_no)
@@ -1,10 +1,9 @@
1
1
  module Cats
2
2
  module Core
3
3
  class LostCommodity < ApplicationRecord
4
- belongs_to :dispatch
4
+ belongs_to :receipt_authorization
5
5
 
6
- validates :quantity, presence: true
7
- validates :commodity_status, presence: true, inclusion: { in: Commodity::COMMODITY_STATUSES }
6
+ validates :quantity, presence: true, numericality: { greater_than: 0 }
8
7
  end
9
8
  end
10
9
  end
@@ -0,0 +1,10 @@
1
+ module Cats
2
+ module Core
3
+ class Receipt < ApplicationRecord
4
+ belongs_to :receipt_authorization
5
+
6
+ validates :commodity_status, presence: true, inclusion: { in: Commodity::COMMODITY_STATUSES }
7
+ validates :quantity, presence: true, numericality: { greater_than: 0 }
8
+ end
9
+ end
10
+ end
@@ -1,26 +1,22 @@
1
1
  module Cats
2
2
  module Core
3
3
  class ReceiptAuthorization < Authorization
4
+ has_many :receipts
5
+ has_many :lost_commodities
4
6
  has_many :receipt_transactions
5
7
 
6
- validates :lost_quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
8
+ validates :received_quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
7
9
  validate :validate_total_quantity
8
10
 
9
11
  def validate_total_quantity
10
12
  return unless dispatch && quantity
11
13
 
12
- received = dispatch.receipt_authorizations.sum(:quantity) + dispatch.receipt_authorizations.sum(:lost_quantity)
14
+ received = dispatch.receipt_authorizations.sum(:quantity)
13
15
  diff = dispatch.quantity - received
14
16
  diff += quantity_was if quantity_was
15
- diff += lost_quantity_was if lost_quantity_was
16
17
 
17
18
  errors.add(:quantity, "authorized is higher than dispatch quantity (Max = #{diff}).") if quantity > diff
18
19
  end
19
-
20
- def confirm
21
- self.status = CONFIRMED
22
- save!
23
- end
24
20
  end
25
21
  end
26
22
  end
@@ -9,6 +9,7 @@ module Cats
9
9
  validate :validate_receipt, :validate_quantity
10
10
 
11
11
  delegate(:code, to: :destination, prefix: true)
12
+ delegate(:dispatch_reference_no, to: :receipt_authorization)
12
13
 
13
14
  def validate_receipt
14
15
  return unless receipt_authorization
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class DispatchAuthorizationSerializer < ActiveModel::Serializer
4
4
  attributes :id, :dispatch_id, :dispatch_reference_no, :store_id, :store_name, :quantity, :authorized_by_id,
5
- :authorizer_full_name
5
+ :authorizer_full_name, :dispatch_status, :plate_no, :driver_name
6
6
  end
7
7
  end
8
8
  end
@@ -1,7 +1,7 @@
1
1
  module Cats
2
2
  module Core
3
3
  class LostCommoditySerializer < ActiveModel::Serializer
4
- attributes :id, :dispatch_id, :quantity, :commodity_status, :remark
4
+ attributes :id, :receipt_authorization_id, :quantity, :remark
5
5
  end
6
6
  end
7
7
  end
@@ -1,8 +1,8 @@
1
1
  module Cats
2
2
  module Core
3
3
  class ReceiptAuthorizationSerializer < ActiveModel::Serializer
4
- attributes :id, :dispatch_id, :dispatch_reference_no, :store_id, :store_name, :quantity, :lost_quantity, :remark,
5
- :status, :authorized_by_id, :authorizer_full_name
4
+ attributes :id, :dispatch_id, :dispatch_reference_no, :store_id, :store_name, :quantity, :received_quantity,
5
+ :remark, :status, :authorized_by_id, :authorizer_full_name
6
6
  end
7
7
  end
8
8
  end
@@ -1,8 +1,7 @@
1
1
  module Cats
2
2
  module Core
3
3
  class ReceiptSerializer < ActiveModel::Serializer
4
- attributes :id, :dispatch_id, :dispatch_reference_no, :commodity_status, :quantity, :status, :remark,
5
- :prepared_by_id, :prepared_by_email
4
+ attributes :id, :receipt_authorization_id, :commodity_status, :quantity, :remark
6
5
  end
7
6
  end
8
7
  end
@@ -1,12 +1,8 @@
1
1
  module Cats
2
2
  module Core
3
3
  class ReceiptTransactionSerializer < ActiveModel::Serializer
4
- attributes :id, :receipt_authorization_id, :dispatch_reference, :destination_id, :destination_code, :quantity,
4
+ attributes :id, :receipt_authorization_id, :dispatch_reference_no, :destination_id, :destination_code, :quantity,
5
5
  :transaction_date, :status
6
-
7
- def dispatch_reference
8
- object.receipt_authorization.dispatch.reference_no
9
- end
10
6
  end
11
7
  end
12
8
  end
@@ -0,0 +1,25 @@
1
+ module Cats
2
+ module Core
3
+ class AuthorizationService
4
+ # A method to confirm a dispatch authorization. This method
5
+ # also checks if all authorizations under a dispatch are confirmed
6
+ # and if so it sets the dispatch status to READY_TO_START.
7
+ def confirm(id)
8
+ authorization = DispatchAuthorization.find(id)
9
+
10
+ ActiveRecord::Base.transaction do
11
+ authorization.confirm
12
+
13
+ # Check if all authorizations under the dispatch are confirmed.
14
+ dispatch = authorization.dispatch
15
+ if dispatch.all_authorizations_confirmed?
16
+ dispatch.quantity = dispatch.dispatch_transactions.sum(:quantity)
17
+ dispatch.dispatch_status = Dispatch::READY_TO_START
18
+ dispatch.save!
19
+ end
20
+ end
21
+ authorization
22
+ end
23
+ end
24
+ end
25
+ end
data/config/routes.rb CHANGED
@@ -96,13 +96,13 @@ Cats::Core::Engine.routes.draw do
96
96
  post '/dispatch_plan_items/filter', controller: :dispatch_plan_items, action: :filter
97
97
  get '/dispatch_plan_items/:id/dispatches', controller: :dispatches, action: :index, as: :dispatches_plan_item
98
98
 
99
+ post '/dispatches/filter', controller: :dispatches, action: :filter
99
100
  get '/dispatches/search', controller: :dispatches, action: :search, as: :search_dispatches
100
101
  resources :dispatches, except: %i[index destroy] do
101
102
  member do
102
103
  get 'dispatch_authorizations', controller: :dispatch_authorizations, action: :index
103
104
  get 'receipt_authorizations', controller: :receipt_authorizations, action: :index
104
105
  get 'receipts', controller: :receipts, action: :index
105
- get 'lost', controller: :lost_commodities, action: :index
106
106
  get 'commodity'
107
107
  post 'approve'
108
108
  post 'start'
@@ -117,13 +117,22 @@ Cats::Core::Engine.routes.draw do
117
117
  end
118
118
  end
119
119
 
120
+ get(
121
+ '/storekeeper/:id/authorizations',
122
+ controller: :dispatch_authorizations,
123
+ action: :storekeeper_authorizations,
124
+ as: :storekeeper_authorizations
125
+ )
120
126
  resources :receipt_authorizations, except: %i[index destroy] do
121
127
  member do
122
128
  get 'transactions', controller: :receipt_transactions, action: :index
129
+ get 'lost', controller: :lost_commodities, action: :index
130
+ get 'receipts', controller: :receipts, action: :index
123
131
  post 'confirm', controller: :receipt_authorizations, action: :confirm
124
132
  end
125
133
  end
126
134
 
135
+ resources :receipts, except: %i[index destroy]
127
136
  post(
128
137
  'dispatch_transactions/allocation',
129
138
  controller: :dispatch_transactions,
@@ -10,7 +10,7 @@ class CreateCatsCoreReceiptAuthorizations < ActiveRecord::Migration[6.1]
10
10
  index: { name: 'store_on_ra_indx' },
11
11
  foreign_key: { to_table: :cats_core_stores }
12
12
  t.float :quantity, null: false
13
- t.float :lost_quantity, null: false, default: 0
13
+ t.float :received_quantity, null: false, default: 0
14
14
  t.string :status, null: false, default: 'Authorized'
15
15
  t.string :remark
16
16
  t.references :authorized_by,
@@ -0,0 +1,15 @@
1
+ class CreateCatsCoreReceipts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cats_core_receipts do |t|
4
+ t.references :receipt_authorization,
5
+ null: false,
6
+ index: { name: 'ra_on_receipts_indx' },
7
+ foreign_key: { to_table: :cats_core_receipt_authorizations }
8
+ t.string :commodity_status, null: false
9
+ t.float :quantity, null: false
10
+ t.string :remark
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -1,12 +1,11 @@
1
1
  class CreateCatsCoreLostCommodities < ActiveRecord::Migration[7.0]
2
2
  def change
3
3
  create_table :cats_core_lost_commodities do |t|
4
- t.references :dispatch,
4
+ t.references :receipt_authorization,
5
5
  null: false,
6
- index: { name: 'lc_on_dispatch_indx' },
7
- foreign_key: { to_table: :cats_core_dispatches }
6
+ index: { name: 'ra_on_lc_indx' },
7
+ foreign_key: { to_table: :cats_core_receipt_authorizations }
8
8
  t.float :quantity, null: false
9
- t.string :commodity_status, null: false
10
9
  t.string :remark
11
10
 
12
11
  t.timestamps
@@ -1,5 +1,5 @@
1
1
  module Cats
2
2
  module Core
3
- VERSION = '1.4.22'.freeze
3
+ VERSION = '1.4.23'.freeze
4
4
  end
5
5
  end
@@ -33,11 +33,27 @@ FactoryBot.define do
33
33
  end
34
34
  end
35
35
 
36
+ trait :ready_to_start do
37
+ after(:create) do |dispatch, options|
38
+ authorization = create(:dispatch_authorization, dispatch: dispatch, store: options.stack.store)
39
+ dispatch.approve
40
+ create(:dispatch_transaction, dispatch_authorization: authorization, source: options.stack, quantity: 100)
41
+ authorization.confirm
42
+ dispatch.quantity = 100
43
+ dispatch.dispatch_status = Cats::Core::Dispatch::READY_TO_START
44
+ dispatch.save!
45
+ end
46
+ end
47
+
36
48
  trait :started do
37
49
  after(:create) do |dispatch, options|
38
50
  authorization = create(:dispatch_authorization, dispatch: dispatch, store: options.stack.store)
39
51
  dispatch.approve
40
52
  create(:dispatch_transaction, dispatch_authorization: authorization, source: options.stack, quantity: 100)
53
+ authorization.confirm
54
+ dispatch.quantity = 100
55
+ dispatch.dispatch_status = Cats::Core::Dispatch::READY_TO_START
56
+ dispatch.save!
41
57
  dispatch.start
42
58
  end
43
59
  end
@@ -1,8 +1,7 @@
1
1
  FactoryBot.define do
2
2
  factory :lost_commodity, class: 'Cats::Core::LostCommodity' do
3
- dispatch
3
+ receipt_authorization
4
4
  quantity { 100 }
5
- commodity_status { Cats::Core::Commodity::DAMAGED }
6
5
  remark { FFaker::Name.name }
7
6
  end
8
7
  end
@@ -1,19 +1,25 @@
1
1
  FactoryBot.define do
2
2
  factory :receipt_authorization, class: 'Cats::Core::ReceiptAuthorization' do
3
- dispatch do
4
- dispatch = create(:dispatch, :with_transaction)
5
- dispatch.start
6
- dispatch
7
- end
3
+ association :dispatch, :started
8
4
  store
9
5
  quantity { 100 }
10
- lost_quantity { 0 }
6
+ received_quantity { 0 }
11
7
  remark { FFaker::Name.name }
12
8
  status { Cats::Core::ReceiptAuthorization::AUTHORIZED }
13
9
  authorized_by factory: :user
14
10
 
11
+ trait :with_receipt do
12
+ after(:create) do |authorization|
13
+ create(:receipt, receipt_authorization: authorization, quantity: 100)
14
+ end
15
+ end
16
+
15
17
  trait :confirmed do
16
- status { Cats::Core::ReceiptAuthorization::CONFIRMED }
18
+ after(:create) do |authorization|
19
+ create(:receipt, receipt_authorization: authorization, quantity: 100)
20
+ authorization.status = Cats::Core::Authorization::CONFIRMED
21
+ authorization.save!
22
+ end
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :receipt, class: 'Cats::Core::Receipt' do
3
+ receipt_authorization
4
+ commodity_status { Cats::Core::Commodity::GOOD }
5
+ quantity { 50 }
6
+ remark { FFaker::Name.name }
7
+ end
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cats_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.22
4
+ version: 1.4.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henock L.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-27 00:00:00.000000000 Z
11
+ date: 2022-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -246,6 +246,7 @@ files:
246
246
  - app/controllers/cats/core/notifications_controller.rb
247
247
  - app/controllers/cats/core/receipt_authorizations_controller.rb
248
248
  - app/controllers/cats/core/receipt_transactions_controller.rb
249
+ - app/controllers/cats/core/receipts_controller.rb
249
250
  - app/controllers/cats/core/roles_controller.rb
250
251
  - app/controllers/cats/core/round_plans_controller.rb
251
252
  - app/controllers/cats/core/routes_controller.rb
@@ -292,6 +293,7 @@ files:
292
293
  - app/models/cats/core/program.rb
293
294
  - app/models/cats/core/purchase_order.rb
294
295
  - app/models/cats/core/ration.rb
296
+ - app/models/cats/core/receipt.rb
295
297
  - app/models/cats/core/receipt_authorization.rb
296
298
  - app/models/cats/core/receipt_transaction.rb
297
299
  - app/models/cats/core/rhn_request.rb
@@ -350,6 +352,7 @@ files:
350
352
  - app/serializers/cats/core/unit_conversion_serializer.rb
351
353
  - app/serializers/cats/core/unit_of_measure_serializer.rb
352
354
  - app/serializers/cats/core/user_serializer.rb
355
+ - app/services/cats/core/authorization_service.rb
353
356
  - app/services/cats/core/dispatch_plan_service.rb
354
357
  - app/services/cats/core/dispatch_service.rb
355
358
  - app/services/cats/core/menu_service.rb
@@ -396,6 +399,7 @@ files:
396
399
  - db/migrate/20210719133710_create_cats_core_stacking_rules.rb
397
400
  - db/migrate/20210724074657_create_cats_core_notifications.rb
398
401
  - db/migrate/20210727074646_create_cats_core_receipt_authorizations.rb
402
+ - db/migrate/20210727105834_create_cats_core_receipts.rb
399
403
  - db/migrate/20210728041505_create_cats_core_lost_commodities.rb
400
404
  - db/migrate/20210814160628_create_cats_core_receipt_transactions.rb
401
405
  - db/migrate/20210814175406_create_cats_core_stack_transactions.rb
@@ -465,6 +469,7 @@ files:
465
469
  - spec/factories/cats/core/rations.rb
466
470
  - spec/factories/cats/core/receipt_authorizations.rb
467
471
  - spec/factories/cats/core/receipt_transactions.rb
472
+ - spec/factories/cats/core/receipts.rb
468
473
  - spec/factories/cats/core/rhn_requests.rb
469
474
  - spec/factories/cats/core/role_menus.rb
470
475
  - spec/factories/cats/core/roles.rb