cats_core 1.5.14 → 1.5.16
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 +4 -4
- data/app/controllers/cats/core/receipt_authorizations_controller.rb +10 -0
- data/app/controllers/cats/core/receipt_transactions_controller.rb +2 -2
- data/app/controllers/cats/core/stack_transactions_controller.rb +25 -0
- data/app/controllers/cats/core/stores_controller.rb +1 -0
- data/app/models/cats/core/dispatch_plan.rb +4 -3
- data/app/models/cats/core/dispatch_transaction.rb +1 -1
- data/app/models/cats/core/receipt.rb +1 -1
- data/app/models/cats/core/receipt_transaction.rb +1 -0
- data/app/models/cats/core/rhn_request.rb +3 -3
- data/app/models/cats/core/round_plan.rb +5 -3
- data/app/models/cats/core/round_ration.rb +2 -1
- data/app/models/cats/core/stack.rb +8 -1
- data/app/models/concerns/cats/core/dispatchable.rb +3 -3
- data/app/notifications/cats/core/receipt_authorization_notification.rb +31 -0
- data/app/notifications/cats/core/round_plan_notification.rb +27 -0
- data/app/serializers/cats/core/receipt_transaction_serializer.rb +2 -1
- data/app/services/cats/core/authorization_service.rb +17 -0
- data/app/services/cats/core/round_plan_service.rb +31 -0
- data/config/routes.rb +4 -0
- data/db/migrate/20221024081134_add_reference_no_to_cats_core_receipts.rb +1 -1
- data/db/migrate/20221024081141_add_reference_no_to_cats_core_dispatch_transactions.rb +1 -1
- data/db/migrate/20230102064317_add_receipt_number_to_cats_core_receipt_transactions.rb +5 -0
- data/lib/cats/core/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 279f9103030fd0c0a858e6d2d5c2f71b69644f17b3654b7e8cd6226deeefabb3
|
4
|
+
data.tar.gz: 58431c85a8824cd879b58f550fa28969b1f45bd9ba04cb16ab69553a6e01c3d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3f8d565b6b939cadff349df0add73ba2e50ae4eef45629d412748754e307aaf7952b69bf3138232c549c560766f23e8dcfbceb5b14ae3f7b3ddccb9c428ab92
|
7
|
+
data.tar.gz: e3d1c7576b48388d6f8144401218b47fd2d40b0320f1ffbe6f9ef674e70d2ab295aed46fb2ac6d9571ca0c99d611f529dc047d3e073bde557d9e02a9c726fb77
|
@@ -11,6 +11,16 @@ module Cats
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def create
|
15
|
+
authorization = ReceiptAuthorization.new(model_params)
|
16
|
+
if authorization.save
|
17
|
+
AuthorizationService.new.send_notification(authorization)
|
18
|
+
render json: { success: true, data: serialize(authorization) }, status: :created
|
19
|
+
else
|
20
|
+
render json: { success: false, error: authorization.errors.full_messages[0] }, status: :unprocessable_entity
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
14
24
|
def confirm
|
15
25
|
authorization = ReceiptAuthorization.find(params[:id])
|
16
26
|
authorization.confirm
|
@@ -18,8 +18,8 @@ module Cats
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def model_params
|
21
|
-
params.require(:payload).permit(:receipt_authorization_id, :
|
22
|
-
:unit_id)
|
21
|
+
params.require(:payload).permit(:receipt_authorization_id, :receipt_number, :destination_id,
|
22
|
+
:transaction_date, :quantity, :unit_id)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class StackTransactionsController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def index
|
7
|
+
super do
|
8
|
+
StackTransaction.joins({ source: :store }, :unit)
|
9
|
+
.where(cats_core_stacks: { cats_core_stores: { warehouse_id: params[:id] } })
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def filter
|
14
|
+
query = StackTransaction.ransack(params[:q])
|
15
|
+
render json: { success: true, data: serialize(query.result) }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def model_params
|
21
|
+
params.require(:payload).permit(:source_id, :destination_id, :transaction_date, :quantity, :unit_id)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -23,16 +23,17 @@ module Cats
|
|
23
23
|
end
|
24
24
|
|
25
25
|
after_save do |plan|
|
26
|
-
plan.dispatchable&.
|
26
|
+
plan.dispatchable&.complete if status == DRAFT && dispatchable.instance_of?(RhnRequest)
|
27
|
+
plan.dispatchable&.in_progress if status == DRAFT && dispatchable.instance_of?(RoundPlan)
|
27
28
|
end
|
28
29
|
|
29
30
|
def validate_dispatchable
|
30
|
-
# Check if dispatchable is already
|
31
|
+
# Check if dispatchable is already completed and raise error if so.
|
31
32
|
return unless dispatchable
|
32
33
|
|
33
34
|
return if dispatchable.status == RhnRequest::APPROVED
|
34
35
|
|
35
|
-
errors.add(:dispatchable, 'is already
|
36
|
+
errors.add(:dispatchable, 'is already completed.') if id.nil? && dispatchable.status == Dispatchable::COMPLETED
|
36
37
|
end
|
37
38
|
|
38
39
|
def approve
|
@@ -7,7 +7,7 @@ module Cats
|
|
7
7
|
belongs_to :dispatch_authorization
|
8
8
|
|
9
9
|
validates :source_id, uniqueness: { scope: :dispatch_authorization_id }
|
10
|
-
validates :reference_no, presence: true
|
10
|
+
# validates :reference_no, presence: true
|
11
11
|
validate :validate_dispatch
|
12
12
|
validate :validate_source_quantity, :validate_authorized_quantity, unless: :skip_quantity_validation
|
13
13
|
|
@@ -9,7 +9,7 @@ module Cats
|
|
9
9
|
validates :commodity_status, presence: true, inclusion: { in: Commodity::COMMODITY_STATUSES }
|
10
10
|
validates :commodity_grade, inclusion: { in: Commodity::COMMODITY_GRADES }, allow_nil: true
|
11
11
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
12
|
-
validates :reference_no, presence: true
|
12
|
+
# validates :reference_no, presence: true
|
13
13
|
validate :validate_quantity
|
14
14
|
|
15
15
|
delegate(:abbreviation, to: :unit, prefix: true)
|
@@ -8,6 +8,7 @@ module Cats
|
|
8
8
|
|
9
9
|
validates :transaction_date, presence: true
|
10
10
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
11
|
+
validates :receipt_number, presence: true
|
11
12
|
validate :validate_receipt, :validate_quantity
|
12
13
|
|
13
14
|
delegate(:code, to: :destination, prefix: true)
|
@@ -67,15 +67,15 @@ module Cats
|
|
67
67
|
save!
|
68
68
|
end
|
69
69
|
|
70
|
-
def
|
70
|
+
def complete
|
71
71
|
raise(StandardError, 'Request is not approved.') unless status == APPROVED
|
72
72
|
|
73
|
-
self.status =
|
73
|
+
self.status = COMPLETED
|
74
74
|
save!
|
75
75
|
end
|
76
76
|
|
77
77
|
def allocate
|
78
|
-
raise(StandardError, 'Request is not
|
78
|
+
raise(StandardError, 'Request is not completed.') unless status == COMPLETED
|
79
79
|
|
80
80
|
self.status = ALLOCATED
|
81
81
|
save!
|
@@ -4,8 +4,10 @@ module Cats
|
|
4
4
|
include Dispatchable
|
5
5
|
|
6
6
|
NEEDS_APPROVED = 'Needs Approved'.freeze
|
7
|
+
IN_PROGRESS = 'In Progress'.freeze
|
7
8
|
|
8
9
|
STATUSES << NEEDS_APPROVED
|
10
|
+
STATUSES << IN_PROGRESS
|
9
11
|
|
10
12
|
belongs_to :plan
|
11
13
|
belongs_to :region, class_name: 'Cats::Core::Location'
|
@@ -42,17 +44,17 @@ module Cats
|
|
42
44
|
update!(status: APPROVED)
|
43
45
|
end
|
44
46
|
|
45
|
-
def
|
47
|
+
def in_progress
|
46
48
|
raise(StandardError, 'Plan is not approved.') unless status == APPROVED
|
47
49
|
|
48
|
-
self.status =
|
50
|
+
self.status = IN_PROGRESS
|
49
51
|
save!
|
50
52
|
end
|
51
53
|
|
52
54
|
def validate_rounds
|
53
55
|
return unless rounds && plan
|
54
56
|
|
55
|
-
errors.add(:rounds, 'cannot be an empty list') if rounds.
|
57
|
+
errors.add(:rounds, 'cannot be an empty list') if rounds.empty?
|
56
58
|
|
57
59
|
existing_rounds = plan.round_plans.where(region: region).map(&:rounds).sum([])
|
58
60
|
rounds.each do |round|
|
@@ -6,7 +6,8 @@ module Cats
|
|
6
6
|
belongs_to :unit_of_measure
|
7
7
|
belongs_to :round_plan
|
8
8
|
|
9
|
-
validates :quantity,
|
9
|
+
validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
|
10
|
+
validates :no_of_days, presence: true, numericality: { greater_than: 0 }
|
10
11
|
|
11
12
|
delegate(:name, to: :commodity_category, prefix: true)
|
12
13
|
delegate(:name, to: :beneficiary_category, prefix: true)
|
@@ -29,7 +29,7 @@ module Cats
|
|
29
29
|
delegate :batch_no, to: :commodity, prefix: true
|
30
30
|
delegate :abbreviation, to: :unit, prefix: true
|
31
31
|
|
32
|
-
after_save :update_store_space
|
32
|
+
after_save :update_store_space, :destroy_stack
|
33
33
|
|
34
34
|
def validate_coordinates
|
35
35
|
return unless store.present? && length.present? && width.present? && start_x.present? && start_y.present?
|
@@ -169,6 +169,13 @@ module Cats
|
|
169
169
|
}
|
170
170
|
end
|
171
171
|
end
|
172
|
+
|
173
|
+
def destroy_stack
|
174
|
+
return unless stack_status == Cats::Core::Stack::ALLOCATED && quantity.zero?
|
175
|
+
|
176
|
+
self.stack_status = Cats::Core::Stack::DESTROYED
|
177
|
+
save!
|
178
|
+
end
|
172
179
|
end
|
173
180
|
end
|
174
181
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# A concern to represent entities that lead to dispatch plan.
|
2
2
|
# All classes including this concern must implement `request_reference()`,
|
3
|
-
# `
|
3
|
+
# `complete()`, and `request_quantity()` methods, which will be used to generate
|
4
4
|
# reference information in dispatch plan serializer.
|
5
5
|
module Cats
|
6
6
|
module Core
|
@@ -9,10 +9,10 @@ module Cats
|
|
9
9
|
|
10
10
|
DRAFT = 'Draft'.freeze
|
11
11
|
APPROVED = 'Approved'.freeze
|
12
|
-
|
12
|
+
COMPLETED = 'Completed'.freeze
|
13
13
|
|
14
14
|
# rubocop:disable Style/MutableConstant
|
15
|
-
STATUSES = [DRAFT, APPROVED,
|
15
|
+
STATUSES = [DRAFT, APPROVED, COMPLETED]
|
16
16
|
# rubocop:enable Style/MutableConstant
|
17
17
|
|
18
18
|
included do
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class ReceiptAuthorizationNotification < Noticed::Base
|
4
|
+
deliver_by :database
|
5
|
+
|
6
|
+
param :receipt_authorization
|
7
|
+
|
8
|
+
def message
|
9
|
+
authorization = params[:receipt_authorization]
|
10
|
+
dispatch = authorization.dispatch
|
11
|
+
commodity = dispatch.dispatch_plan_item.commodity
|
12
|
+
title = "Receipt Authorization Notification - #{commodity.name}"
|
13
|
+
date = Date.today
|
14
|
+
|
15
|
+
body = <<~BODY
|
16
|
+
Commodity with the following details has been dispatched to you:
|
17
|
+
Authorization no. = #{dispatch.dispatch_plan_item.reference_no}
|
18
|
+
Dispatch Ref. = #{dispatch.reference_no}
|
19
|
+
Batch No. = #{commodity.batch_no}
|
20
|
+
Commodity = #{commodity.name}
|
21
|
+
Quantity = #{authorization.quantity}
|
22
|
+
Unit = #{authorization.unit.abbreviation}
|
23
|
+
Truck Plate No. = #{dispatch.plate_no}
|
24
|
+
Driver Name = #{dispatch.driver_name}
|
25
|
+
Driver Phone = #{dispatch.driver_phone}
|
26
|
+
BODY
|
27
|
+
{ title: title, date: date, body: body }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class RoundPlanNotification < Noticed::Base
|
4
|
+
deliver_by :database
|
5
|
+
|
6
|
+
param :round_plan
|
7
|
+
|
8
|
+
def message
|
9
|
+
round_plan = params[:round_plan]
|
10
|
+
plan = round_plan.plan
|
11
|
+
title = "Round Plan - #{round_plan.reference_no}"
|
12
|
+
date = Date.today
|
13
|
+
body = <<~BODY
|
14
|
+
A round plan with the following specifications needs your approval:
|
15
|
+
Reference No. = #{round_plan.reference_no}
|
16
|
+
Status = #{round_plan.status}
|
17
|
+
Region = #{round_plan.region.name}
|
18
|
+
Rounds = #{round_plan.rounds}
|
19
|
+
Program = #{plan.program.name}
|
20
|
+
Year = #{plan.year}
|
21
|
+
Season = #{plan.season}
|
22
|
+
BODY
|
23
|
+
{ title: title, date: date, body: body }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class ReceiptTransactionSerializer < ActiveModel::Serializer
|
4
|
-
attributes :id, :receipt_authorization_id, :
|
4
|
+
attributes :id, :receipt_authorization_id, :receipt_number,
|
5
|
+
:dispatch_reference_no, :destination_id, :destination_code, :quantity,
|
5
6
|
:transaction_date, :status, :unit_id, :unit_abbreviation
|
6
7
|
end
|
7
8
|
end
|
@@ -95,6 +95,23 @@ module Cats
|
|
95
95
|
quantity: item.quantity
|
96
96
|
}
|
97
97
|
end
|
98
|
+
|
99
|
+
def send_notification(authorization)
|
100
|
+
notification_rule = NotificationRule.find_by(code: 'receipt_authorization')
|
101
|
+
error = 'Notification rule not found for receipt authorization notification.'
|
102
|
+
raise(StandardError, error) unless notification_rule
|
103
|
+
|
104
|
+
users = User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
|
105
|
+
recipients = users.map do |user|
|
106
|
+
details = user.details
|
107
|
+
|
108
|
+
user if details.key?('stores') && details['stores'].include?(authorization.store_id)
|
109
|
+
end.compact
|
110
|
+
return if recipients.empty?
|
111
|
+
|
112
|
+
notification = ReceiptAuthorizationNotification.with(receipt_authorization: authorization)
|
113
|
+
notification.deliver(recipients)
|
114
|
+
end
|
98
115
|
end
|
99
116
|
end
|
100
117
|
end
|
@@ -96,6 +96,7 @@ module Cats
|
|
96
96
|
}
|
97
97
|
end
|
98
98
|
Cats::Core::BeneficiaryRoundPlanItem.insert_all!(ben_round_plan_items, record_timestamps: true)
|
99
|
+
send_approval_notification(round_plan)
|
99
100
|
round_plan
|
100
101
|
end
|
101
102
|
|
@@ -186,8 +187,38 @@ module Cats
|
|
186
187
|
else
|
187
188
|
plan.approve
|
188
189
|
end
|
190
|
+
send_approved_notification(plan)
|
189
191
|
plan
|
190
192
|
end
|
193
|
+
|
194
|
+
def send_approval_notification(round_plan)
|
195
|
+
notification_rule = NotificationRule.find_by(code: 'round_plan_approval')
|
196
|
+
error = 'Notification rule not found for round plan approval notification.'
|
197
|
+
raise(StandardError, error) unless notification_rule
|
198
|
+
|
199
|
+
users = User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
|
200
|
+
return if users.empty?
|
201
|
+
|
202
|
+
notification = RoundPlanNotification.with(round_plan: round_plan)
|
203
|
+
notification.deliver(users)
|
204
|
+
end
|
205
|
+
|
206
|
+
def send_approved_notification(round_plan)
|
207
|
+
notification_rule = NotificationRule.find_by(code: 'round_plan_approved')
|
208
|
+
error = 'Notification rule not found for round plan approved notification.'
|
209
|
+
raise(StandardError, error) unless notification_rule
|
210
|
+
|
211
|
+
users = User.joins(roles: :application_module).where(
|
212
|
+
cats_core_roles: {
|
213
|
+
name: notification_rule.roles,
|
214
|
+
cats_core_application_modules: { prefix: 'CATS-TMS' }
|
215
|
+
}
|
216
|
+
)
|
217
|
+
return if users.empty?
|
218
|
+
|
219
|
+
notification = RoundPlanNotification.with(round_plan: round_plan)
|
220
|
+
notification.deliver(users)
|
221
|
+
end
|
191
222
|
end
|
192
223
|
end
|
193
224
|
end
|
data/config/routes.rb
CHANGED
@@ -56,6 +56,9 @@ Cats::Core::Engine.routes.draw do
|
|
56
56
|
to: 'spaces#available_space',
|
57
57
|
as: :warehouse_space,
|
58
58
|
defaults: { level: Cats::Core::SpaceService::WAREHOUSE }
|
59
|
+
get '/warehouses/:id/stack_transactions',
|
60
|
+
to: 'stack_transactions#index',
|
61
|
+
as: :warehouse_stack_transactions
|
59
62
|
get '/stores/:id/space',
|
60
63
|
to: 'spaces#available_space',
|
61
64
|
as: :store_space,
|
@@ -184,6 +187,7 @@ Cats::Core::Engine.routes.draw do
|
|
184
187
|
resources :dispatch_transactions, except: %i[index new edit destroy]
|
185
188
|
post '/receipt_transactions/filter', controller: :receipt_transactions, action: :filter
|
186
189
|
resources :receipt_transactions, except: %i[index new edit destroy]
|
190
|
+
resources :stack_transactions, except: %i[index new edit destroy]
|
187
191
|
resources :lost_commodities, except: %i[index destroy]
|
188
192
|
get '/plans/:id/round_plans', controller: :round_plans, action: :index, as: :round_plans_plan
|
189
193
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class AddReferenceNoToCatsCoreDispatchTransactions < ActiveRecord::Migration[7.0]
|
2
2
|
def change
|
3
|
-
add_column :cats_core_dispatch_transactions, :reference_no, :string, null:
|
3
|
+
add_column :cats_core_dispatch_transactions, :reference_no, :string, null: true
|
4
4
|
end
|
5
5
|
end
|
data/lib/cats/core/version.rb
CHANGED
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.5.
|
4
|
+
version: 1.5.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henock L.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_model_serializers
|
@@ -270,6 +270,7 @@ files:
|
|
270
270
|
- app/controllers/cats/core/round_plans_controller.rb
|
271
271
|
- app/controllers/cats/core/routes_controller.rb
|
272
272
|
- app/controllers/cats/core/spaces_controller.rb
|
273
|
+
- app/controllers/cats/core/stack_transactions_controller.rb
|
273
274
|
- app/controllers/cats/core/stacks_controller.rb
|
274
275
|
- app/controllers/cats/core/stores_controller.rb
|
275
276
|
- app/controllers/cats/core/swaps_controller.rb
|
@@ -358,6 +359,8 @@ files:
|
|
358
359
|
- app/models/concerns/cats/core/dispatchable.rb
|
359
360
|
- app/notifications/cats/core/allocation_notification.rb
|
360
361
|
- app/notifications/cats/core/dispatch_notification.rb
|
362
|
+
- app/notifications/cats/core/receipt_authorization_notification.rb
|
363
|
+
- app/notifications/cats/core/round_plan_notification.rb
|
361
364
|
- app/notifications/cats/core/simple_notification.rb
|
362
365
|
- app/serializers/cats/core/cash_donation_serializer.rb
|
363
366
|
- app/serializers/cats/core/commodity_category_serializer.rb
|
@@ -477,6 +480,7 @@ files:
|
|
477
480
|
- db/migrate/20220923190857_create_cats_core_application_settings.rb
|
478
481
|
- db/migrate/20221024081134_add_reference_no_to_cats_core_receipts.rb
|
479
482
|
- db/migrate/20221024081141_add_reference_no_to_cats_core_dispatch_transactions.rb
|
483
|
+
- db/migrate/20230102064317_add_receipt_number_to_cats_core_receipt_transactions.rb
|
480
484
|
- lib/cats/core.rb
|
481
485
|
- lib/cats/core/engine.rb
|
482
486
|
- lib/cats/core/version.rb
|