cats_core 1.1.37 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f07fe2e24b72c5cf2c4c7d7c9acd92332e6e7a80b4d9305fdffcbb94365fb67e
4
- data.tar.gz: 6c343a483c11b17757966c650fa355a541a62483eafa9d6ad5b5428ebb1aef63
3
+ metadata.gz: ed6937d9d787e6b9cd4861aed52c82cddec427a2607f86e6b76ee835dbf66c0b
4
+ data.tar.gz: 99f350b323761a10f70058b01cceda92acd6c92d2824f06d011effaad3cd4780
5
5
  SHA512:
6
- metadata.gz: 5c7a27a3e6babd99f6e331c63d6d79ecfb6af34e5c6ae746ccd538d11e1ea62e48ea9c6b4b84eb5d1500da1466992f2acae40297127e5822c12b4f8ed418a728
7
- data.tar.gz: 930ccb77011e1cabc7ce9851fe22584f50346d1494d4556df7df90159fb9f2d99b3340c0f9ff1f7f5cc0a7b334f5274e74b67191d48abecf709f04af27b553b5
6
+ metadata.gz: 67d812874a6b1680fff22c83dff0ac53193585ac9136e9753ef28db9f0210cb503d9b0f73c19d73aa45b55f042e2ff4e2787af35ef713a0ed12029c982b789a9
7
+ data.tar.gz: bca2a928d539658137bb2b545ab0ea2f98611312e2c4cd8a0dffa3fe415b19b4771dd97a5550631ccc8689817686affdb0c074a93aeb479a78fbca98d4e758c5
@@ -20,7 +20,7 @@ module Cats
20
20
  jwt = Cats::Core::TokenAuthService.issue(payload)
21
21
  render json: { token: jwt, user: payload }
22
22
  else
23
- render json: { error: 'Invalid username or password.' }, status: 400
23
+ render json: { error: 'Invalid password.' }, status: 400
24
24
  end
25
25
  else
26
26
  render json: { error: 'User does not exist.' }, status: 400
@@ -1,43 +1,10 @@
1
1
  module Cats
2
2
  module Core
3
3
  class CurrenciesController < ApplicationController
4
- before_action :set_currency, only: %i[show update]
5
-
6
- def index
7
- data = ActiveModelSerializers::SerializableResource.new(Cats::Core::Currency.all)
8
- render json: { success: true, data: data }
9
- end
10
-
11
- def show
12
- data = ActiveModelSerializers::SerializableResource.new(@currency)
13
- render json: { success: true, data: data }
14
- end
15
-
16
- def create
17
- obj = Cats::Core::Currency.new(model_params)
18
- if obj.save
19
- data = ActiveModelSerializers::SerializableResource.new(obj)
20
- render json: { success: true, data: data }, status: :created
21
- else
22
- render json: { success: false, error: obj.errors.full_messages[0] }, status: :unprocessable_entity
23
- end
24
- end
25
-
26
- def update
27
- if @currency.update(model_params)
28
- data = ActiveModelSerializers::SerializableResource.new(@currency)
29
- render json: { success: true, data: data }
30
- else
31
- render json: { success: false, error: @currency.errors.full_messages[0] }, status: :unprocessable_entity
32
- end
33
- end
4
+ include Common
34
5
 
35
6
  private
36
7
 
37
- def set_currency
38
- @currency = Cats::Core::Currency.find(params[:id])
39
- end
40
-
41
8
  def model_params
42
9
  params.require(:payload).permit(:code, :name)
43
10
  end
@@ -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
@@ -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,67 @@ 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
+ result = false
44
+ Cats::Core::Commodity.transaction do
45
+ self.status = APPROVED
46
+ save!
47
+ store = Cats::Core::Store.find_by(code: 'SUP-STORE')
48
+ raise(StandardError, 'Supplier store does not exist.') unless store
31
49
 
32
- self.approved = false
50
+ stack = Cats::Core::Stack.create!(
51
+ code: batch_no,
52
+ store: store,
53
+ commodity: self,
54
+ quantity: quantity,
55
+ commodity_status: GOOD,
56
+ stack_status: Stack::ALLOCATED,
57
+ length: 100,
58
+ width: 100,
59
+ height: 10,
60
+ start_x: 1,
61
+ start_y: 1
62
+ )
63
+ result = stack.id.positive?
64
+ end
65
+ result
33
66
  end
34
67
 
35
- def name
36
- source.commodity_category.name
68
+ def allocate(ignore_errors: true)
69
+ statuses = Allocation.where(commodity_id: id).map(&:allocation_status).uniq
70
+ unless statuses.count == 1 && statuses[0] == APPROVED
71
+ return if ignore_errors
72
+
73
+ raise(StandardError, 'There are allocations in "Draft" state.')
74
+ end
75
+
76
+ quantity = allocations.sum(:quantity)
77
+ unless quantity == self.quantity
78
+ return if ignore_errors
79
+
80
+ raise(StandardError, 'Total allocations quantity is not the same as commodity quantity.')
81
+ end
82
+
83
+ self.status = ALLOCATED
84
+ save!
37
85
  end
38
86
  end
39
87
  end
@@ -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.37'.freeze
3
+ VERSION = '1.2.0'.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.37
4
+ version: 1.2.0
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-11-01 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