cats_core 1.1.36 → 1.1.40

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d66e9f780b4e36013c3eac6a0c319e61270199d621eea8cc1747451eb09e95b
4
- data.tar.gz: 83c8aee6ba3e4a15d3aa6a0255f0c8a6aead3247fed994e5ced103c91cc1d314
3
+ metadata.gz: c2c955101b31607adc7eec1388f6f4c172181ffd78a2e514b5c220130899b4f3
4
+ data.tar.gz: f99a81794245cd12120a3b5dac7cd04a6f8a89ef7ca96dbce409b341629172c3
5
5
  SHA512:
6
- metadata.gz: b77f6a0923079b2e847b263602e42fb489245f15442b11ccd0509d4c6b3790b1f3950469557a686d0b4cbeb9f34c9c94dc14c82e853e0d2d064d42c5db3bd4e8
7
- data.tar.gz: ac19f2ff28600eaa8d580bef4d6ad8fdec01ea0511f163d486d8bc3397e67d95eab82a79c32977b01e88952f789d53198a40c599fc977c14a623f4cf3eb4da12
6
+ metadata.gz: b80445e45187d6590c0219cba05d11defbea0d298f79cb0f3c7c8fc82705e17ef6abc1223181c8ae6dca44138aa4b46a4d3aaa9f7732c7efb5d92ba6aeeff76e
7
+ data.tar.gz: 1a3efcd95681646652dd285f6f96f1ba28da6ba6214f32db735ff8f4571de66c28c68342843c9a347cb4f70e2a6078800ef4eff27898d675cabf79e80037b72e
@@ -57,7 +57,7 @@ module Cats
57
57
  def validate_commodity_status
58
58
  return unless commodity
59
59
 
60
- errors.add(:commodity, 'should be approved first.') unless commodity.approved
60
+ errors.add(:commodity, 'should be approved first.') unless commodity.status == Commodity::APPROVED
61
61
  end
62
62
 
63
63
  def approve
@@ -68,6 +68,10 @@ module Cats
68
68
 
69
69
  self.allocation_status = Allocation::APPROVED
70
70
  save!
71
+
72
+ # If the commodity is all allocated, then we should
73
+ # set its status to allocated.
74
+ commodity.allocate
71
75
  end
72
76
  end
73
77
  end
@@ -22,6 +22,7 @@ module Cats
22
22
 
23
23
  allocated = AllocationItem.where(allocation: allocation).sum(:quantity)
24
24
  remaining = allocation.quantity - allocated
25
+ remaining += quantity_was if quantity_was
25
26
  errors.add(:quantity, "exceeds allocated quantity. Maximum allowed is #{remaining}") if quantity > remaining
26
27
  end
27
28
 
@@ -1,7 +1,11 @@
1
1
  module Cats
2
2
  module Core
3
3
  class Commodity < ApplicationRecord
4
- after_initialize :set_approved
4
+ # Statuses
5
+ DRAFT = 'Draft'.freeze
6
+ APPROVED = 'Approved'.freeze
7
+ ALLOCATED = 'Allocated'.freeze
8
+ STATUSES = [DRAFT, APPROVED, ALLOCATED].freeze
5
9
 
6
10
  # Commodity statuses
7
11
  GOOD = 'Good'.freeze
@@ -17,23 +21,66 @@ module Cats
17
21
  belongs_to :unit_of_measure
18
22
  belongs_to :source, polymorphic: true
19
23
 
24
+ has_many :allocations
25
+
20
26
  validates :best_use_before, presence: true
21
27
  validates :batch_no, presence: true, uniqueness: true
22
28
  validates :quantity, presence: true, numericality: { greater_than: 0 }
23
29
  validates :volume_per_metric_ton, numericality: { greater_than: 0, allow_nil: true }
24
30
  validates :arrival_status, presence: true, inclusion: { in: ARRIVAL_STATUSES }
31
+ validates :status, presence: true, inclusion: { in: STATUSES }
25
32
 
26
33
  delegate(:abbreviation, to: :unit_of_measure, prefix: true)
27
34
  delegate(:reference_no, to: :source, prefix: true)
28
35
 
29
- def set_approved
30
- return unless new_record?
36
+ def name
37
+ source.commodity_category.name
38
+ end
39
+
40
+ def approve
41
+ raise(StandardError, 'Commodity already approved.') if status == APPROVED
42
+
43
+ Cats::Core::Commodity.transaction do
44
+ self.status = APPROVED
45
+ save!
46
+ store = Cats::Core::Store.find_by(code: 'SUP-STORE')
47
+ raise(StandardError, 'Supplier store does not exist.') unless store
31
48
 
32
- self.approved = false
49
+ Cats::Core::Stack.create!(
50
+ code: batch_no,
51
+ store: store,
52
+ commodity: self,
53
+ quantity: quantity,
54
+ commodity_status: GOOD,
55
+ stack_status: Stack::ALLOCATED,
56
+ length: 100,
57
+ width: 100,
58
+ height: 10,
59
+ start_x: 1,
60
+ start_y: 1
61
+ )
62
+ true
63
+ end
64
+ false
33
65
  end
34
66
 
35
- def name
36
- source.commodity_category.name
67
+ def allocate(ignore_errors: true)
68
+ statuses = Allocation.where(commodity_id: id).map(&:allocation_status).uniq
69
+ unless statuses.count == 1 && statuses[0] == APPROVED
70
+ return if ignore_errors
71
+
72
+ raise(StandardError, 'There are allocations in "Draft" state.')
73
+ end
74
+
75
+ quantity = allocations.sum(:quantity)
76
+ unless quantity == self.quantity
77
+ return if ignore_errors
78
+
79
+ raise(StandardError, 'Total allocations quantity is not the same as commodity quantity.')
80
+ end
81
+
82
+ self.status = ALLOCATED
83
+ save!
37
84
  end
38
85
  end
39
86
  end
@@ -32,6 +32,7 @@ module Cats
32
32
 
33
33
  dispatched = Dispatch.where(allocation_item: allocation_item).sum(:quantity)
34
34
  remaining = allocation_item.quantity - dispatched
35
+ remaining += quantity_was if quantity_was
35
36
  errors.add(:quantity, "exceeds allocated quantity. Maximum allowed is #{remaining}") if quantity > remaining
36
37
  end
37
38
 
@@ -18,7 +18,7 @@ module Cats
18
18
  def validate_commodity_status
19
19
  return unless commodity
20
20
 
21
- errors.add(:commodity, 'should be approved first.') unless commodity.approved
21
+ errors.add(:commodity, 'should be approved first.') unless commodity.status == Commodity::APPROVED
22
22
  end
23
23
 
24
24
  def validate_quantity
@@ -30,6 +30,11 @@ module Cats
30
30
  remaining += quantity_was if quantity_was
31
31
  errors.add(:quantity, "exceeds commodity quantity. Maximum allowed is #{remaining}") if quantity > remaining
32
32
  end
33
+
34
+ def approve
35
+ self.status = APPROVED
36
+ save!
37
+ end
33
38
  end
34
39
  end
35
40
  end
@@ -22,6 +22,8 @@ module Cats
22
22
  validate :validate_coordinates, :validate_dimensions, :validate_distance_from_wall, :validate_overlap,
23
23
  :validate_space_between_stack, unless: -> { store && store.code == 'SUP-STORE' }
24
24
 
25
+ delegate :batch_no, to: :commodity, prefix: true
26
+
25
27
  after_save :update_store_space
26
28
 
27
29
  def validate_coordinates
@@ -58,8 +60,8 @@ module Cats
58
60
  return unless store.present? && length.present? && width.present? && start_x.present? && start_y.present?
59
61
 
60
62
  rule = stacking_rules
61
- if start_x < rule.distance_from_wall || store.length - (start_y + length) < rule.distance_from_wall ||
62
- store.width - (start_x + width) < rule.distance_from_wall || start_y < rule.distance_from_wall
63
+ if start_x < rule.distance_from_wall || store.length - (start_x + length) < rule.distance_from_wall ||
64
+ store.width - (start_y + width) < rule.distance_from_wall || start_y < rule.distance_from_wall
63
65
  errors.add(:base,
64
66
  message: "The stack must be placed #{rule.distance_from_wall} meter away from a store wall")
65
67
  end
@@ -3,7 +3,7 @@ module Cats
3
3
  class CommoditySerializer < ActiveModel::Serializer
4
4
  attributes :id, :name, :batch_no, :description, :unit_of_measure_id, :unit_of_measure_abbreviation, :source_id,
5
5
  :source_type, :source_reference_no, :quantity, :best_use_before, :volume_per_metric_ton,
6
- :arrival_status, :approved
6
+ :arrival_status, :status
7
7
  end
8
8
  end
9
9
  end
@@ -17,6 +17,7 @@ module Cats
17
17
  end
18
18
 
19
19
  receipt.status = Cats::Core::Receipt::STACKED
20
+ receipt.save!
20
21
  receipt.receipt_transactions.each(&:commit)
21
22
  receipt
22
23
  end
@@ -0,0 +1,6 @@
1
+ class AddStatusToCatsCoreCommodities < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :cats_core_commodities, :status, :string, null: false, default: 'Draft'
4
+ remove_column :cats_core_commodities, :approved, :boolean
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Cats
2
2
  module Core
3
- VERSION = '1.1.36'.freeze
3
+ VERSION = '1.1.40'.freeze
4
4
  end
5
5
  end
@@ -2,7 +2,11 @@ FactoryBot.define do
2
2
  factory :allocation, class: 'Cats::Core::Allocation' do
3
3
  reference_no { FFaker::Name.name }
4
4
  rhn_request { nil }
5
- commodity
5
+ commodity do
6
+ c = create(:commodity)
7
+ c.approve
8
+ c
9
+ end
6
10
  source factory: :location
7
11
  quantity { 50 }
8
12
  commodity_status { Cats::Core::Commodity::GOOD }
@@ -8,6 +8,6 @@ FactoryBot.define do
8
8
  best_use_before { Date.today + 2.month }
9
9
  volume_per_metric_ton { 10 }
10
10
  arrival_status { Cats::Core::Commodity::AT_SOURCE }
11
- approved { true }
11
+ status { Cats::Core::Commodity::DRAFT }
12
12
  end
13
13
  end
@@ -1,7 +1,11 @@
1
1
  FactoryBot.define do
2
2
  factory :rhn_request, class: 'Cats::Core::RhnRequest' do
3
3
  reference_no { FFaker::Name.name }
4
- commodity
4
+ commodity do
5
+ c = create(:commodity)
6
+ c.approve
7
+ c
8
+ end
5
9
  quantity { 100 }
6
10
  request_date { Date.today }
7
11
  requested_by { FFaker::Name.name }
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.1.36
4
+ version: 1.1.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henock L.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2021-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -346,6 +346,7 @@ files:
346
346
  - db/migrate/20210814175406_create_cats_core_stack_transactions.rb
347
347
  - db/migrate/20211002050739_create_cats_core_notification_rules.rb
348
348
  - db/migrate/20211024063240_add_status_to_cats_core_rhn_requests.rb
349
+ - db/migrate/20211030133752_add_status_to_cats_core_commodities.rb
349
350
  - lib/cats/core.rb
350
351
  - lib/cats/core/engine.rb
351
352
  - lib/cats/core/version.rb