cats_core 1.5.2 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/cats/core/commodities_controller.rb +2 -2
- data/app/controllers/cats/core/dispatch_authorizations_controller.rb +3 -3
- data/app/controllers/cats/core/dispatch_transactions_controller.rb +2 -2
- data/app/controllers/cats/core/lost_commodities_controller.rb +2 -2
- data/app/controllers/cats/core/receipt_authorizations_controller.rb +4 -3
- data/app/controllers/cats/core/receipt_transactions_controller.rb +3 -2
- data/app/controllers/cats/core/receipts_controller.rb +2 -2
- data/app/controllers/cats/core/stacks_controller.rb +3 -3
- data/app/models/cats/core/application_setting.rb +10 -0
- data/app/models/cats/core/authorization.rb +14 -8
- data/app/models/cats/core/commodity.rb +10 -0
- data/app/models/cats/core/dispatch.rb +3 -19
- data/app/models/cats/core/dispatch_authorization.rb +13 -0
- data/app/models/cats/core/dispatch_plan.rb +3 -1
- data/app/models/cats/core/dispatch_plan_item.rb +4 -3
- data/app/models/cats/core/dispatch_transaction.rb +23 -10
- data/app/models/cats/core/hub_authorization.rb +15 -9
- data/app/models/cats/core/lost_commodity.rb +29 -0
- data/app/models/cats/core/receipt.rb +22 -0
- data/app/models/cats/core/receipt_authorization.rb +5 -8
- data/app/models/cats/core/receipt_transaction.rb +13 -5
- data/app/models/cats/core/rhn_request.rb +25 -8
- data/app/models/cats/core/stack.rb +3 -0
- data/app/models/cats/core/stack_transaction.rb +1 -0
- data/app/models/cats/core/transaction.rb +4 -0
- data/app/models/cats/core/unit_conversion.rb +21 -3
- data/app/notifications/cats/core/dispatch_notification.rb +2 -0
- data/app/serializers/cats/core/commodity_serializer.rb +1 -1
- data/app/serializers/cats/core/dispatch_authorization_serializer.rb +2 -1
- data/app/serializers/cats/core/dispatch_plan_item_serializer.rb +1 -1
- data/app/serializers/cats/core/dispatch_transaction_serializer.rb +2 -1
- data/app/serializers/cats/core/lost_commodity_serializer.rb +1 -1
- data/app/serializers/cats/core/receipt_authorization_serializer.rb +1 -1
- data/app/serializers/cats/core/receipt_serializer.rb +2 -1
- data/app/serializers/cats/core/receipt_transaction_serializer.rb +1 -1
- data/app/serializers/cats/core/stack_serializer.rb +1 -1
- data/app/services/cats/core/authorization_service.rb +2 -0
- data/app/services/cats/core/dispatch_plan_service.rb +1 -0
- data/app/utils/cats/core/util.rb +15 -0
- data/app/utils/cats/core/validation_util.rb +20 -0
- data/db/migrate/20210717033223_create_cats_core_commodities.rb +5 -0
- data/db/migrate/20210717171101_create_cats_core_stacks.rb +4 -0
- data/db/migrate/20210718042755_create_cats_core_rhn_requests.rb +4 -0
- data/db/migrate/20210718045516_create_cats_core_dispatches.rb +1 -1
- data/db/migrate/20210718055414_create_cats_core_dispatch_authorizations.rb +4 -0
- data/db/migrate/20210718202957_create_cats_core_dispatch_transactions.rb +4 -0
- data/db/migrate/20210727074646_create_cats_core_receipt_authorizations.rb +4 -0
- data/db/migrate/20210727105834_create_cats_core_receipts.rb +4 -0
- data/db/migrate/20210728041505_create_cats_core_lost_commodities.rb +4 -0
- data/db/migrate/20210814160628_create_cats_core_receipt_transactions.rb +4 -0
- data/db/migrate/20210814175406_create_cats_core_stack_transactions.rb +4 -0
- data/db/migrate/20220209083928_create_cats_core_hub_authorizations.rb +4 -0
- data/db/migrate/20220923190857_create_cats_core_application_settings.rb +14 -0
- data/lib/cats/core/version.rb +1 -1
- data/spec/factories/cats/core/application_settings.rb +7 -0
- data/spec/factories/cats/core/commodities.rb +1 -0
- data/spec/factories/cats/core/dispatch_authorizations.rb +1 -0
- data/spec/factories/cats/core/dispatch_transactions.rb +5 -4
- data/spec/factories/cats/core/dispatches.rb +7 -1
- data/spec/factories/cats/core/hub_authorizations.rb +1 -0
- data/spec/factories/cats/core/lost_commodities.rb +1 -0
- data/spec/factories/cats/core/receipt_authorizations.rb +1 -0
- data/spec/factories/cats/core/receipt_transactions.rb +5 -1
- data/spec/factories/cats/core/receipts.rb +1 -0
- data/spec/factories/cats/core/rhn_requests.rb +1 -0
- data/spec/factories/cats/core/stack_transactions.rb +1 -0
- data/spec/factories/cats/core/stacks.rb +1 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9a6ea1b862a6804a3e215898c7aac9966ffedbdf7aa3c8d9661f9356c4b8a24
|
4
|
+
data.tar.gz: f08e17d946b62d02d148cffbe97ab52c9b1f113245d4dffca6f5d67256ec7ea0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea2045f6a7a7954a4157952747c932e096f5df6e8ab2a56e888ca1f656a85eb7bd08a572ad0f15a05b53b0defc51354c27755be960c69c4c0ec49b232ad9b5db
|
7
|
+
data.tar.gz: d91d382689b7abab6221e64457123334bc93bc0357ffdf6eb28e71466d46183ba3aeab2b0d01b24abb0184a7b01b06ae5d0e2331220b710b3a193ac751061ad6
|
@@ -5,7 +5,7 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
Commodity.all.includes({ project: { source: :commodity_category } }, :unit_of_measure)
|
8
|
+
Commodity.all.includes({ project: { source: :commodity_category } }, :unit_of_measure, :package_unit)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -18,7 +18,7 @@ module Cats
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def filter
|
21
|
-
query = Commodity.includes(:project, :unit_of_measure).ransack(params[:q])
|
21
|
+
query = Commodity.includes(:project, :unit_of_measure, :package_unit).ransack(params[:q])
|
22
22
|
render json: { success: true, data: serialize(query.result) }
|
23
23
|
end
|
24
24
|
|
@@ -5,7 +5,7 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
DispatchAuthorization.includes(:dispatch, :store, :authorized_by).where(dispatch_id: params[:id])
|
8
|
+
DispatchAuthorization.includes(:dispatch, :store, :authorized_by, :unit).where(dispatch_id: params[:id])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -21,7 +21,7 @@ module Cats
|
|
21
21
|
storekeeper = User.find(params[:id])
|
22
22
|
stores = storekeeper.stores
|
23
23
|
authorizations = DispatchAuthorization.joins(:dispatch)
|
24
|
-
.includes(:dispatch, :store, :authorized_by)
|
24
|
+
.includes(:dispatch, :store, :authorized_by, :unit)
|
25
25
|
.where(store: stores, dispatch: { dispatch_status: Dispatch::APPROVED })
|
26
26
|
render json: { success: true, data: serialize(authorizations) }
|
27
27
|
end
|
@@ -29,7 +29,7 @@ module Cats
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def model_params
|
32
|
-
params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :status, :authorized_by_id)
|
32
|
+
params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :unit_id, :status, :authorized_by_id)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -5,7 +5,7 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
DispatchTransaction.includes(:source).where(dispatch_authorization_id: params[:id])
|
8
|
+
DispatchTransaction.includes(:source, :unit).where(dispatch_authorization_id: params[:id])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -37,7 +37,7 @@ module Cats
|
|
37
37
|
private
|
38
38
|
|
39
39
|
def model_params
|
40
|
-
params.require(:payload).permit(:source_id, :dispatch_authorization_id, :transaction_date, :quantity)
|
40
|
+
params.require(:payload).permit(:source_id, :dispatch_authorization_id, :transaction_date, :quantity, :unit_id)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -5,12 +5,12 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
LostCommodity.where(receipt_authorization_id: params[:id])
|
8
|
+
LostCommodity.includes(:unit).where(receipt_authorization_id: params[:id])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def model_params
|
13
|
-
params.require(:payload).permit(:receipt_authorization_id, :quantity, :remark)
|
13
|
+
params.require(:payload).permit(:receipt_authorization_id, :quantity, :unit_id, :remark)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -7,7 +7,7 @@ module Cats
|
|
7
7
|
|
8
8
|
def index
|
9
9
|
super do
|
10
|
-
ReceiptAuthorization.includes(:dispatch, :store, :authorized_by).where(dispatch_id: params[:id])
|
10
|
+
ReceiptAuthorization.includes(:dispatch, :store, :authorized_by, :unit).where(dispatch_id: params[:id])
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -40,7 +40,7 @@ module Cats
|
|
40
40
|
storekeeper = User.find(params[:id])
|
41
41
|
status = params[:status]
|
42
42
|
stores = storekeeper.stores
|
43
|
-
authorizations = ReceiptAuthorization.includes(:dispatch, :store, :authorized_by)
|
43
|
+
authorizations = ReceiptAuthorization.includes(:dispatch, :store, :authorized_by, :unit)
|
44
44
|
.where(store: stores, status: status)
|
45
45
|
render json: { success: true, data: serialize(authorizations) }
|
46
46
|
end
|
@@ -48,7 +48,8 @@ module Cats
|
|
48
48
|
private
|
49
49
|
|
50
50
|
def model_params
|
51
|
-
params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :remark, :status,
|
51
|
+
params.require(:payload).permit(:dispatch_id, :store_id, :quantity, :unit_id, :remark, :status,
|
52
|
+
:authorized_by_id)
|
52
53
|
end
|
53
54
|
|
54
55
|
def driver_confirm_params
|
@@ -5,7 +5,7 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
ReceiptTransaction.includes(:destination, { receipt_authorization: :dispatch })
|
8
|
+
ReceiptTransaction.includes(:destination, { receipt_authorization: :dispatch }, :unit)
|
9
9
|
.where(receipt_authorization_id: params[:id])
|
10
10
|
end
|
11
11
|
end
|
@@ -18,7 +18,8 @@ module Cats
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def model_params
|
21
|
-
params.require(:payload).permit(:receipt_authorization_id, :destination_id, :transaction_date, :quantity
|
21
|
+
params.require(:payload).permit(:receipt_authorization_id, :destination_id, :transaction_date, :quantity,
|
22
|
+
:unit_id)
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -5,7 +5,7 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
Receipt.where(receipt_authorization_id: params[:id])
|
8
|
+
Receipt.includes(:unit).where(receipt_authorization_id: params[:id])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -13,7 +13,7 @@ module Cats
|
|
13
13
|
|
14
14
|
def model_params
|
15
15
|
params.require(:payload).permit(:receipt_authorization_id, :commodity_status, :commodity_grade, :quantity,
|
16
|
-
:remark)
|
16
|
+
:unit_id, :remark)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -5,12 +5,12 @@ module Cats
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
Stack.includes(:commodity).where(store_id: params[:id])
|
8
|
+
Stack.includes(:commodity, :unit).where(store_id: params[:id])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def filter
|
13
|
-
query = Stack.includes(:commodity).where(store_id: params[:id]).ransack(params[:q])
|
13
|
+
query = Stack.includes(:commodity, :unit).where(store_id: params[:id]).ransack(params[:q])
|
14
14
|
render json: { success: true, data: serialize(query.result) }
|
15
15
|
end
|
16
16
|
|
@@ -38,7 +38,7 @@ module Cats
|
|
38
38
|
|
39
39
|
def model_params
|
40
40
|
params.require(:payload).permit(:code, :length, :width, :height, :start_x, :start_y, :commodity_id, :store_id,
|
41
|
-
:commodity_status, :stack_status, :quantity)
|
41
|
+
:commodity_status, :stack_status, :quantity, :unit_id)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -3,6 +3,7 @@ module Cats
|
|
3
3
|
class Authorization < ApplicationRecord
|
4
4
|
self.abstract_class = true
|
5
5
|
after_initialize :set_status
|
6
|
+
before_validation :set_unit
|
6
7
|
|
7
8
|
# Authorization statuses
|
8
9
|
AUTHORIZED = 'Authorized'.freeze
|
@@ -11,6 +12,7 @@ module Cats
|
|
11
12
|
|
12
13
|
belongs_to :dispatch
|
13
14
|
belongs_to :store
|
15
|
+
belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
|
14
16
|
belongs_to :authorized_by, class_name: 'Cats::Core::User'
|
15
17
|
|
16
18
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
@@ -23,6 +25,15 @@ module Cats
|
|
23
25
|
delegate(:dispatch_status, to: :dispatch)
|
24
26
|
delegate(:plate_no, to: :dispatch)
|
25
27
|
delegate(:driver_name, to: :dispatch)
|
28
|
+
delegate(:abbreviation, to: :unit, prefix: true)
|
29
|
+
|
30
|
+
def set_unit
|
31
|
+
return if unit
|
32
|
+
|
33
|
+
return unless dispatch
|
34
|
+
|
35
|
+
self.unit = dispatch.unit
|
36
|
+
end
|
26
37
|
|
27
38
|
def validate_dispatch_status
|
28
39
|
return unless dispatch
|
@@ -52,8 +63,9 @@ module Cats
|
|
52
63
|
transactions.each(&:commit)
|
53
64
|
self.status = CONFIRMED
|
54
65
|
save!
|
66
|
+
reload
|
55
67
|
if dispatch.all_authorizations_confirmed?
|
56
|
-
|
68
|
+
Util.generate_pin(dispatch)
|
57
69
|
dispatch.quantity = dispatch.dispatch_transactions.sum(:quantity)
|
58
70
|
dispatch.dispatch_status = Dispatch::READY_TO_START
|
59
71
|
dispatch.save!
|
@@ -70,17 +82,11 @@ module Cats
|
|
70
82
|
self.received_quantity = total_received
|
71
83
|
self.status = CONFIRMED
|
72
84
|
save!
|
73
|
-
generate_pin
|
85
|
+
Util.generate_pin(self)
|
74
86
|
end
|
75
87
|
self
|
76
88
|
end
|
77
89
|
|
78
|
-
def generate_pin
|
79
|
-
pin = SecureRandom.hex(10)
|
80
|
-
self.auth_details = { pin: pin, active: true, expires_at: DateTime.now + 1.hour }
|
81
|
-
save!
|
82
|
-
end
|
83
|
-
|
84
90
|
private
|
85
91
|
|
86
92
|
def set_status
|
@@ -44,6 +44,7 @@ module Cats
|
|
44
44
|
|
45
45
|
belongs_to :unit_of_measure
|
46
46
|
belongs_to :project
|
47
|
+
belongs_to :package_unit, class_name: 'Cats::Core::UnitOfMeasure', optional: true
|
47
48
|
|
48
49
|
validates :best_use_before, presence: true
|
49
50
|
validates :batch_no, presence: true, uniqueness: true
|
@@ -56,6 +57,9 @@ module Cats
|
|
56
57
|
|
57
58
|
delegate(:abbreviation, to: :unit_of_measure, prefix: 'unit')
|
58
59
|
delegate(:code, to: :project, prefix: true)
|
60
|
+
delegate(:abbreviation, to: :package_unit, prefix: true, allow_nil: true)
|
61
|
+
|
62
|
+
alias_attribute :unit, :unit_of_measure
|
59
63
|
|
60
64
|
def name
|
61
65
|
# For this to be efficient, our query should use includes like
|
@@ -86,6 +90,7 @@ module Cats
|
|
86
90
|
store: store,
|
87
91
|
commodity: self,
|
88
92
|
quantity: quantity,
|
93
|
+
unit: unit,
|
89
94
|
commodity_status: GOOD,
|
90
95
|
stack_status: Stack::ALLOCATED,
|
91
96
|
length: 100,
|
@@ -98,6 +103,11 @@ module Cats
|
|
98
103
|
end
|
99
104
|
result
|
100
105
|
end
|
106
|
+
|
107
|
+
def requested_quantity
|
108
|
+
requests = RhnRequest.where(commodity: self)
|
109
|
+
UnitConversion.harmonized_total(requests, unit_of_measure)
|
110
|
+
end
|
101
111
|
end
|
102
112
|
end
|
103
113
|
end
|
@@ -35,10 +35,6 @@ module Cats
|
|
35
35
|
dispatch_plan_item.destination.name
|
36
36
|
end
|
37
37
|
|
38
|
-
def authorized_quantity
|
39
|
-
dispatch_authorizations.sum(:quantity)
|
40
|
-
end
|
41
|
-
|
42
38
|
def validate_dispatch_plan_status
|
43
39
|
return unless dispatch_plan_item
|
44
40
|
|
@@ -52,16 +48,9 @@ module Cats
|
|
52
48
|
# Check if dispatch has authorizations
|
53
49
|
raise(StandardError, 'Dispatch has no authorizations.') unless dispatch_authorizations.count.positive?
|
54
50
|
|
55
|
-
|
56
|
-
authorized = dispatches.inject(0) do |result, dispatch|
|
57
|
-
result += dispatch.authorized_quantity
|
58
|
-
result
|
59
|
-
end
|
60
|
-
diff = authorized - dispatch_plan_item.quantity
|
61
|
-
error = "Total authorized quantity exceeds allocated quantity (Extra = #{diff})."
|
62
|
-
raise(StandardError, error) if diff.positive?
|
63
|
-
|
51
|
+
dispatch_total = UnitConversion.harmonized_total(dispatch_authorizations, unit)
|
64
52
|
self.dispatch_status = APPROVED
|
53
|
+
self.quantity = dispatch_total
|
65
54
|
save!
|
66
55
|
end
|
67
56
|
|
@@ -86,6 +75,7 @@ module Cats
|
|
86
75
|
dispatch: self,
|
87
76
|
store: store,
|
88
77
|
quantity: quantity,
|
78
|
+
unit: unit,
|
89
79
|
received_quantity: 0,
|
90
80
|
status: Authorization::AUTHORIZED,
|
91
81
|
authorized_by: authorized_by
|
@@ -128,12 +118,6 @@ module Cats
|
|
128
118
|
}
|
129
119
|
end
|
130
120
|
end
|
131
|
-
|
132
|
-
def generate_pin
|
133
|
-
pin = SecureRandom.hex(10)
|
134
|
-
self.auth_details = { pin: pin, active: true, expires_at: DateTime.now + 1.hour }
|
135
|
-
save!
|
136
|
-
end
|
137
121
|
end
|
138
122
|
end
|
139
123
|
end
|
@@ -3,11 +3,24 @@ module Cats
|
|
3
3
|
class DispatchAuthorization < Authorization
|
4
4
|
has_many :dispatch_transactions
|
5
5
|
|
6
|
+
validate :validate_quantity
|
7
|
+
|
6
8
|
def validate_dispatch_status
|
7
9
|
return unless dispatch
|
8
10
|
|
9
11
|
errors.add(:dispatch, 'is not in draft state.') unless dispatch.dispatch_status == Dispatch::DRAFT
|
10
12
|
end
|
13
|
+
|
14
|
+
def validate_quantity
|
15
|
+
return unless dispatch && quantity && unit
|
16
|
+
|
17
|
+
authorizations = DispatchAuthorization.joins(:dispatch).where(
|
18
|
+
dispatch: { dispatch_plan_item_id: dispatch.dispatch_plan_item_id }
|
19
|
+
)
|
20
|
+
quantity_attribs = %w[dispatch_plan_item quantity]
|
21
|
+
unit_attribs = %w[dispatch_plan_item unit]
|
22
|
+
ValidationUtil.validate_quantity(self, 'dispatch', authorizations, 'allocated', quantity_attribs, unit_attribs)
|
23
|
+
end
|
11
24
|
end
|
12
25
|
end
|
13
26
|
end
|
@@ -54,7 +54,9 @@ module Cats
|
|
54
54
|
# A method which returns the total quantity in the dispatch plan
|
55
55
|
# based on dispatch plan item quantities.
|
56
56
|
def quantity
|
57
|
-
|
57
|
+
raise(StandardError, 'Dispatchable must be RHN request.') unless dispatchable.instance_of?(RhnRequest)
|
58
|
+
|
59
|
+
UnitConversion.harmonized_total(dispatch_plan_items, dispatchable.unit)
|
58
60
|
end
|
59
61
|
|
60
62
|
def region
|
@@ -58,8 +58,8 @@ module Cats
|
|
58
58
|
)
|
59
59
|
end
|
60
60
|
|
61
|
-
total_src =
|
62
|
-
total_dest =
|
61
|
+
total_src = UnitConversion.harmonized_total(source_auth, unit)
|
62
|
+
total_dest = UnitConversion.harmonized_total(dest_auth, unit)
|
63
63
|
|
64
64
|
if source_auth.count == count
|
65
65
|
validate_quantity(total_src, SOURCE_AUTHORIZED)
|
@@ -81,9 +81,10 @@ module Cats
|
|
81
81
|
|
82
82
|
diff = self.quantity - quantity
|
83
83
|
desc = type.split(' ')[0].downcase
|
84
|
+
amount = "#{diff} #{unit.abbreviation}"
|
84
85
|
raise(
|
85
86
|
StandardError,
|
86
|
-
"Authorized #{desc} quantity is not the same as plan item quantity (#{
|
87
|
+
"Authorized #{desc} quantity is not the same as plan item quantity (#{amount} unaccounted for)."
|
87
88
|
)
|
88
89
|
end
|
89
90
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class DispatchTransaction < Transaction
|
4
|
+
before_validation :set_unit
|
5
|
+
|
4
6
|
belongs_to :source, class_name: 'Cats::Core::Stack'
|
5
7
|
belongs_to :dispatch_authorization
|
6
8
|
|
@@ -10,9 +12,17 @@ module Cats
|
|
10
12
|
|
11
13
|
delegate(:code, to: :source, prefix: true)
|
12
14
|
|
15
|
+
def set_unit
|
16
|
+
return if unit
|
17
|
+
|
18
|
+
return unless dispatch_authorization
|
19
|
+
|
20
|
+
self.unit = dispatch_authorization.unit
|
21
|
+
end
|
22
|
+
|
13
23
|
def commit
|
14
24
|
Transaction.transaction do
|
15
|
-
source.quantity -= quantity
|
25
|
+
source.quantity -= UnitConversion.convert(unit, source.unit, quantity)
|
16
26
|
source.save!
|
17
27
|
|
18
28
|
self.status = COMMITTED
|
@@ -30,19 +40,22 @@ module Cats
|
|
30
40
|
def validate_source_quantity
|
31
41
|
return unless quantity && source
|
32
42
|
|
33
|
-
total =
|
34
|
-
|
35
|
-
|
36
|
-
|
43
|
+
total = UnitConversion.convert(source.unit, unit, source.quantity)
|
44
|
+
transactions = DispatchTransaction.where(status: DRAFT, source: source)
|
45
|
+
used = UnitConversion.harmonized_total(transactions, unit)
|
46
|
+
used -= quantity_was if quantity_was
|
47
|
+
|
48
|
+
remaining = total - used
|
49
|
+
return unless quantity > remaining
|
50
|
+
|
51
|
+
errors.add(:quantity, "exceeds source quantity. Maximum allowed is #{remaining} #{unit.abbreviation}")
|
37
52
|
end
|
38
53
|
|
39
54
|
def validate_authorized_quantity
|
40
|
-
return unless quantity && dispatch_authorization
|
55
|
+
return unless quantity && unit && dispatch_authorization
|
41
56
|
|
42
|
-
|
43
|
-
|
44
|
-
diff += quantity_was if quantity_was
|
45
|
-
errors.add(:quantity, "exceeds authorized quantity (Max. = #{diff}).") if quantity > diff
|
57
|
+
transactions = DispatchTransaction.where(dispatch_authorization: dispatch_authorization)
|
58
|
+
ValidationUtil.validate_quantity(self, 'dispatch_authorization', transactions, 'authorized')
|
46
59
|
end
|
47
60
|
|
48
61
|
def skip_quantity_validation
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class HubAuthorization < ApplicationRecord
|
4
|
+
before_validation :set_unit
|
5
|
+
|
4
6
|
SOURCE = 'Source'.freeze
|
5
7
|
DESTINATION = 'Destination'.freeze
|
6
8
|
AUTHORIZATION_TYPES = [SOURCE, DESTINATION].freeze
|
@@ -8,6 +10,7 @@ module Cats
|
|
8
10
|
belongs_to :dispatch_plan_item, optional: true
|
9
11
|
belongs_to :store
|
10
12
|
belongs_to :authorized_by, class_name: 'Cats::Core::User'
|
13
|
+
belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
|
11
14
|
|
12
15
|
validates :quantity, :authorization_type, presence: true
|
13
16
|
validates :quantity, numericality: { greater_than: 0 }
|
@@ -17,21 +20,24 @@ module Cats
|
|
17
20
|
delegate(:plan_reference_no, to: :dispatch_plan_item)
|
18
21
|
delegate(:full_name, to: :authorized_by, prefix: true)
|
19
22
|
delegate(:name, to: :store, prefix: true)
|
23
|
+
delegate(:abbreviation, to: :unit, prefix: true)
|
20
24
|
|
21
|
-
def
|
22
|
-
return
|
25
|
+
def set_unit
|
26
|
+
return if unit
|
23
27
|
|
24
28
|
return unless dispatch_plan_item
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
self.unit = dispatch_plan_item.unit
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate_quantity
|
34
|
+
return unless quantity && unit && dispatch_plan_item
|
35
|
+
|
36
|
+
authorizations = HubAuthorization.where(
|
28
37
|
dispatch_plan_item: dispatch_plan_item,
|
29
38
|
authorization_type: authorization_type
|
30
|
-
)
|
31
|
-
|
32
|
-
|
33
|
-
remaining = total - used
|
34
|
-
errors.add(:quantity, "exceeds allocated quantity. Maximum allowed is #{remaining}") if quantity > remaining
|
39
|
+
)
|
40
|
+
ValidationUtil.validate_quantity(self, 'dispatch_plan_item', authorizations, 'allocated')
|
35
41
|
end
|
36
42
|
end
|
37
43
|
end
|
@@ -1,9 +1,38 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class LostCommodity < ApplicationRecord
|
4
|
+
before_validation :set_unit
|
5
|
+
|
4
6
|
belongs_to :receipt_authorization
|
7
|
+
belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
|
5
8
|
|
6
9
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
10
|
+
validate :validate_quantity
|
11
|
+
|
12
|
+
delegate(:abbreviation, to: :unit, prefix: true)
|
13
|
+
|
14
|
+
def set_unit
|
15
|
+
return if unit
|
16
|
+
|
17
|
+
return unless receipt_authorization
|
18
|
+
|
19
|
+
self.unit = receipt_authorization.unit
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate_quantity
|
23
|
+
return unless quantity && unit && receipt_authorization
|
24
|
+
|
25
|
+
total = UnitConversion.convert(receipt_authorization.unit, unit, receipt_authorization.quantity)
|
26
|
+
receipts = Receipt.where(receipt_authorization: receipt_authorization)
|
27
|
+
losses = LostCommodity.where(receipt_authorization: receipt_authorization)
|
28
|
+
used = UnitConversion.harmonized_total(receipts, unit) + UnitConversion.harmonized_total(losses, unit)
|
29
|
+
used -= quantity_was if quantity_was
|
30
|
+
|
31
|
+
remaining = total - used
|
32
|
+
return unless quantity > remaining
|
33
|
+
|
34
|
+
errors.add(:quantity, "exceeds authorized quantity. Maximum allowed is #{remaining} #{unit.abbreviation}")
|
35
|
+
end
|
7
36
|
end
|
8
37
|
end
|
9
38
|
end
|
@@ -1,11 +1,33 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class Receipt < ApplicationRecord
|
4
|
+
before_validation :set_unit
|
5
|
+
|
4
6
|
belongs_to :receipt_authorization
|
7
|
+
belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
|
5
8
|
|
6
9
|
validates :commodity_status, presence: true, inclusion: { in: Commodity::COMMODITY_STATUSES }
|
7
10
|
validates :commodity_grade, inclusion: { in: Commodity::COMMODITY_GRADES }, allow_nil: true
|
8
11
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
12
|
+
validate :validate_quantity
|
13
|
+
|
14
|
+
delegate(:abbreviation, to: :unit, prefix: true)
|
15
|
+
|
16
|
+
def set_unit
|
17
|
+
return if unit
|
18
|
+
|
19
|
+
return unless receipt_authorization
|
20
|
+
|
21
|
+
self.unit = receipt_authorization.unit
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate_quantity
|
25
|
+
return unless quantity && unit && receipt_authorization
|
26
|
+
|
27
|
+
receipts = Receipt.where(receipt_authorization: receipt_authorization)
|
28
|
+
losses = LostCommodity.where(receipt_authorization: receipt_authorization)
|
29
|
+
ValidationUtil.validate_quantity(self, 'receipt_authorization', receipts + losses, 'authorized')
|
30
|
+
end
|
9
31
|
end
|
10
32
|
end
|
11
33
|
end
|
@@ -6,16 +6,13 @@ module Cats
|
|
6
6
|
has_many :receipt_transactions
|
7
7
|
|
8
8
|
validates :received_quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
|
9
|
-
validate :
|
9
|
+
validate :validate_quantity
|
10
10
|
|
11
|
-
def
|
12
|
-
return unless dispatch && quantity
|
11
|
+
def validate_quantity
|
12
|
+
return unless dispatch && quantity && unit
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
diff += quantity_was if quantity_was
|
17
|
-
|
18
|
-
errors.add(:quantity, "authorized is higher than dispatch quantity (Max = #{diff}).") if quantity > diff
|
14
|
+
authorizations = ReceiptAuthorization.where(dispatch: dispatch)
|
15
|
+
ValidationUtil.validate_quantity(self, 'dispatch', authorizations, 'dispatch')
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Cats
|
2
2
|
module Core
|
3
3
|
class ReceiptTransaction < Transaction
|
4
|
+
before_validation :set_unit
|
5
|
+
|
4
6
|
belongs_to :receipt_authorization
|
5
7
|
belongs_to :destination, class_name: 'Cats::Core::Stack'
|
6
8
|
|
@@ -11,6 +13,14 @@ module Cats
|
|
11
13
|
delegate(:code, to: :destination, prefix: true)
|
12
14
|
delegate(:dispatch_reference_no, to: :receipt_authorization)
|
13
15
|
|
16
|
+
def set_unit
|
17
|
+
return if unit
|
18
|
+
|
19
|
+
return unless receipt_authorization
|
20
|
+
|
21
|
+
self.unit = receipt_authorization.unit
|
22
|
+
end
|
23
|
+
|
14
24
|
def validate_receipt
|
15
25
|
return unless receipt_authorization
|
16
26
|
|
@@ -21,15 +31,13 @@ module Cats
|
|
21
31
|
def validate_quantity
|
22
32
|
return unless quantity && destination && receipt_authorization
|
23
33
|
|
24
|
-
|
25
|
-
|
26
|
-
diff += quantity_was if quantity_was
|
27
|
-
errors.add(:quantity, "exceeds authorized quantity (Max. = #{diff}).") if quantity > diff
|
34
|
+
transactions = ReceiptTransaction.where(receipt_authorization: receipt_authorization)
|
35
|
+
ValidationUtil.validate_quantity(self, 'receipt_authorization', transactions, 'authorized')
|
28
36
|
end
|
29
37
|
|
30
38
|
def commit
|
31
39
|
ReceiptTransaction.transaction do
|
32
|
-
destination.quantity += quantity
|
40
|
+
destination.quantity += UnitConversion.convert(unit, destination.unit, quantity)
|
33
41
|
destination.stack_status = Cats::Core::Stack::ALLOCATED
|
34
42
|
destination.save!
|
35
43
|
self.status = COMMITTED
|