cats_core 1.4.22 → 1.4.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/cats/core/dispatch_authorizations_controller.rb +9 -1
  3. data/app/controllers/cats/core/dispatches_controller.rb +18 -2
  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 +33 -5
  8. data/app/models/cats/core/dispatch.rb +17 -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/dispatch_serializer.rb +1 -1
  15. data/app/serializers/cats/core/lost_commodity_serializer.rb +1 -1
  16. data/app/serializers/cats/core/receipt_authorization_serializer.rb +2 -2
  17. data/app/serializers/cats/core/receipt_serializer.rb +1 -2
  18. data/app/serializers/cats/core/receipt_transaction_serializer.rb +1 -5
  19. data/app/services/cats/core/authorization_service.rb +27 -0
  20. data/app/services/cats/core/dispatch_service.rb +22 -0
  21. data/config/routes.rb +11 -1
  22. data/db/migrate/20210718045516_create_cats_core_dispatches.rb +1 -0
  23. data/db/migrate/20210727074646_create_cats_core_receipt_authorizations.rb +3 -1
  24. data/db/migrate/20210727105834_create_cats_core_receipts.rb +15 -0
  25. data/db/migrate/20210728041505_create_cats_core_lost_commodities.rb +3 -4
  26. data/lib/cats/core/version.rb +1 -1
  27. data/spec/factories/cats/core/dispatches.rb +16 -0
  28. data/spec/factories/cats/core/lost_commodities.rb +1 -2
  29. data/spec/factories/cats/core/receipt_authorizations.rb +13 -7
  30. data/spec/factories/cats/core/receipts.rb +8 -0
  31. 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: ad828e18f9f084f3c2e0343af564a1f1cc4832e935c9eec068503f4293442b87
4
+ data.tar.gz: 8e0520ff2a6df1e2b4dd3f726a60aef02ef45915158c72c73ccbc74a9ae2786d
5
5
  SHA512:
6
- metadata.gz: 234470131214a8e68da2123957a811c55c41c38079c34ec9dde9b9313c0d85c7b88607da5b0a3d7a2dd98f1c2f39942f5790a858d21eb76595a9f0572578d3a5
7
- data.tar.gz: 4f3e4040eff76a430bbcaf24ec3bae51dc54905831f744f23802905c4d6df80cc440184de47c9398be98051be81519010cf4ca9e3818817a3b1fc67b9cd3dda8
6
+ metadata.gz: cc1d8fc0861a5f8c46734cbbf029608625e8734d31361cf924834769166cc6d429f247b169b299616a5bedcf9dffd0cdc2ad4960e4caa502757a1a98cfd55865
7
+ data.tar.gz: '0850a3f89b88aea548765a78f46a8d4cac259642dc3f8c15837ab54c1d5c7911b311b8b55719972fe19312cf614d07042652376556a134ea2e20c8b1f7227fc1'
@@ -11,12 +11,20 @@ module Cats
11
11
 
12
12
  def confirm
13
13
  authorization = DispatchAuthorization.find(params[:id])
14
- authorization.confirm
14
+ authorization = authorization.confirm
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
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class DispatchesController < ApplicationController
4
4
  include Common
5
-
6
- before_action :set_service, only: %i[create_receipt_authorization approve start search confirm]
5
+ skip_before_action :authenticate, only: %i[start_with_pin]
6
+ before_action :set_service, only: %i[create_receipt_authorization approve start start_with_pin search confirm]
7
7
 
8
8
  def index
9
9
  super do
@@ -35,6 +35,13 @@ module Cats
35
35
  render json: { success: false, error: e.message }
36
36
  end
37
37
 
38
+ def start_with_pin
39
+ dispatch = @service.start_with_pin(params[:id], start_with_pin_params[:pin])
40
+ render json: { success: true, data: serialize(dispatch) }
41
+ rescue StandardError => e
42
+ render json: { success: false, error: e.message }
43
+ end
44
+
38
45
  def confirm
39
46
  dispatch = set_object
40
47
  dispatch.confirm
@@ -43,6 +50,11 @@ module Cats
43
50
  render json: { success: false, error: e.message }
44
51
  end
45
52
 
53
+ def filter
54
+ query = Dispatch.ransack(params[:q])
55
+ render json: { success: true, data: serialize(query.result) }
56
+ end
57
+
46
58
  def search
47
59
  data = @service.search(current_user, params[:status])
48
60
  render json: { success: true, data: serialize(data) }
@@ -63,6 +75,10 @@ module Cats
63
75
  params.require(:payload).permit(:reference_no, :dispatch_plan_item_id, :transporter_id, :plate_no, :unit_id,
64
76
  :driver_name, :driver_phone, :remark)
65
77
  end
78
+
79
+ def start_with_pin_params
80
+ params.require(:payload).permit(:pin)
81
+ end
66
82
  end
67
83
  end
68
84
  end
@@ -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,14 +45,39 @@ 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
- raise(StandardError, 'Authorization does not have transactions.') if transactions.blank?
49
+ ActiveRecord::Base.transaction do
50
+ raise(StandardError, 'Authorization does not have transactions.') if transactions.blank?
48
51
 
49
- count = transactions.where(status: Transaction::DRAFT).count
50
- raise(StandardError, 'There are uncommitted transactions.') if count.positive?
52
+ transactions.each(&:commit)
53
+ self.status = CONFIRMED
54
+ save!
55
+ if dispatch.all_authorizations_confirmed?
56
+ dispatch.generate_pin
57
+ dispatch.quantity = dispatch.dispatch_transactions.sum(:quantity)
58
+ dispatch.dispatch_status = Dispatch::READY_TO_START
59
+ dispatch.save!
60
+ end
61
+ end
62
+ elsif instance_of?(ReceiptAuthorization)
63
+ raise(StandardError, 'Authorization does not have receipts.') unless receipts.count.positive?
64
+
65
+ total_received = receipts.sum(:quantity)
66
+ total_lost = lost_commodities.sum(:quantity)
67
+ diff = quantity - (total_received + total_lost)
68
+ raise(StandardError, "A quantity of #{diff} is unaccounted for.") unless diff.zero?
69
+
70
+ self.received_quantity = total_received
71
+ self.status = CONFIRMED
72
+ save!
73
+ generate_pin
51
74
  end
52
- self.status = CONFIRMED
75
+ self
76
+ end
77
+
78
+ def generate_pin
79
+ pin = SecureRandom.hex(10)
80
+ self.auth_details = { pin: pin, active: true, expires_at: DateTime.now + 1.hour }
53
81
  save!
54
82
  end
55
83
 
@@ -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)
@@ -89,6 +92,12 @@ module Cats
89
92
  }
90
93
  end
91
94
  end
95
+
96
+ def generate_pin
97
+ pin = SecureRandom.hex(10)
98
+ self.auth_details = { pin: pin, active: true, expires_at: DateTime.now + 1.hour }
99
+ save!
100
+ end
92
101
  end
93
102
  end
94
103
  end
@@ -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, :status
6
6
  end
7
7
  end
8
8
  end
@@ -3,7 +3,7 @@ module Cats
3
3
  class DispatchSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :dispatch_plan_item_id, :transporter_id, :transporter_name, :plate_no,
5
5
  :driver_name, :driver_phone, :quantity, :remark, :prepared_by_id, :prepared_by_email,
6
- :dispatch_status, :destination
6
+ :dispatch_status, :destination, :auth_details
7
7
 
8
8
  def destination
9
9
  object.dispatch_plan_item.destination.name
@@ -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, :auth_details
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,27 @@
1
+ module Cats
2
+ module Core
3
+ class AuthorizationService
4
+ def driver_confirm(authorization_id, pin)
5
+ authorization = ReceiptAuthorization.find(authorization_id)
6
+ if authorization.status == Authorization::AUTHORIZED
7
+ raise(StandardError, 'Authorization not confirmed by storekeeper.')
8
+ end
9
+
10
+ raise(StandardError, 'No pin has been generated for receipt.') if authorization.auth_details.nil?
11
+
12
+ raise(StandardError, 'Incorrect pin.') unless pin == authorization.auth_details['pin']
13
+
14
+ raise(StandardError, 'Pin is not active.') unless authorization.auth_details['active']
15
+
16
+ if DateTime.now > authorization.auth_details['expires_at']
17
+ authorization.auth_details[:active] = false
18
+ authorization.save!
19
+ raise(StandardError, 'Pin has expired.')
20
+ end
21
+ authorization.driver_confirmed = true
22
+ authorization.save!
23
+ authorization
24
+ end
25
+ end
26
+ end
27
+ end
@@ -37,6 +37,28 @@ module Cats
37
37
  dispatch
38
38
  end
39
39
 
40
+ def start_with_pin(dispatch_id, pin)
41
+ dispatch = Dispatch.find(dispatch_id)
42
+ raise(StandardError, 'Dispatch is already started.') if dispatch.dispatch_status == Dispatch::STARTED
43
+
44
+ raise(StandardError, 'No pin has been generated for dispatch.') if dispatch.auth_details.nil?
45
+
46
+ raise(StandardError, 'Incorrect pin.') unless pin == dispatch.auth_details['pin']
47
+
48
+ raise(StandardError, 'Pin is not active.') unless dispatch.auth_details['active']
49
+
50
+ if DateTime.now > dispatch.auth_details['expires_at']
51
+ dispatch.auth_details[:active] = false
52
+ dispatch.save!
53
+ raise(StandardError, 'Pin has expired.')
54
+ end
55
+ dispatch.start
56
+ send_notification(dispatch)
57
+ dispatch.auth_details = nil
58
+ dispatch.save!
59
+ dispatch
60
+ end
61
+
40
62
  def send_notification(dispatch)
41
63
  notification_rule = Cats::Core::NotificationRule.find_by(code: 'dispatch')
42
64
  raise(StandardError, 'Notification rule not found for dispatch notification.') unless notification_rule
data/config/routes.rb CHANGED
@@ -96,17 +96,18 @@ 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'
109
109
  post 'confirm'
110
+ post 'start_with_pin'
110
111
  end
111
112
  end
112
113
 
@@ -117,13 +118,22 @@ Cats::Core::Engine.routes.draw do
117
118
  end
118
119
  end
119
120
 
121
+ get(
122
+ '/storekeeper/:id/authorizations',
123
+ controller: :dispatch_authorizations,
124
+ action: :storekeeper_authorizations,
125
+ as: :storekeeper_authorizations
126
+ )
120
127
  resources :receipt_authorizations, except: %i[index destroy] do
121
128
  member do
122
129
  get 'transactions', controller: :receipt_transactions, action: :index
130
+ get 'lost', controller: :lost_commodities, action: :index
131
+ get 'receipts', controller: :receipts, action: :index
123
132
  post 'confirm', controller: :receipt_authorizations, action: :confirm
124
133
  end
125
134
  end
126
135
 
136
+ resources :receipts, except: %i[index destroy]
127
137
  post(
128
138
  'dispatch_transactions/allocation',
129
139
  controller: :dispatch_transactions,
@@ -25,6 +25,7 @@ class CreateCatsCoreDispatches < ActiveRecord::Migration[6.1]
25
25
  index: { name: 'pb_on_dispatches_indx' },
26
26
  foreign_key: { to_table: :cats_core_users }
27
27
  t.string :dispatch_status, null: false
28
+ t.jsonb :auth_details
28
29
 
29
30
  t.timestamps
30
31
  end
@@ -10,9 +10,11 @@ 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
+ t.jsonb :auth_details
17
+ t.boolean :driver_confirmed, null: false, default: false
16
18
  t.references :authorized_by,
17
19
  null: false,
18
20
  index: { name: 'ab_on_receipt_authorizations_indx' },
@@ -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.25'.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.25
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-29 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