cats_core 1.5.28 → 1.5.30

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: 9f4c5959fbfc273f8809d25ec667efe26c657ecaf5ffee395db78d7a5082344d
4
- data.tar.gz: f9e7f7f16def88dbd3f228dece31bdfce72b1d546899a93671a345994aaf23b2
3
+ metadata.gz: 03b358ca3dc8a8908dc00309ca843ab82e9703f9224c5d726cf1762034bf76ed
4
+ data.tar.gz: 3e0da8d5c95a1bd32c90f76d78bd17bd3b70e2c5466916945b96d6292c3ae3f7
5
5
  SHA512:
6
- metadata.gz: a965719b330ddaca566572abe5c8a5aec87214f53cfd465c2199477a7e9d5d1b7d43cd07748e2ad0f27a0a6eebc9642d864fccd5fa91dfeb2571137494fe0749
7
- data.tar.gz: 0c2d16529bdee5a560c756e3feeb0b37924bfe531e17771b721ee242024938ed0ca0d52f28bf09899c45a198b5c16ad058e1bd17eaec6747367246f6aaaf63db
6
+ metadata.gz: fb22c2473633590d0c8f760b2a8dd178d19646e6ff9193b79f7536c0bbe9e3f2c16e3a860b9de66938d13279a1bcd0a3855b9593ff48ac5662ce10c9bc071c6c
7
+ data.tar.gz: 73fe0f22b150696c145d28eb4343145f033643ec7259f6865f6b725e2c052880e1905c28b78ea860858da58bb5d0753b96a16fa358e9a7cd2319b3376de27f4f
@@ -76,7 +76,7 @@ module Cats
76
76
  :dispatchable_type,
77
77
  items: %i[
78
78
  reference_no region zone woreda fdp commodity_category unit_id unit quantity source_id destination_id
79
- commodity_id commodity_status
79
+ commodity_id commodity_status beneficiaries
80
80
  ]
81
81
  )
82
82
  end
@@ -104,6 +104,7 @@ module Cats
104
104
  %w[
105
105
  commodity_id
106
106
  commodity_status
107
+ reference_no
107
108
  destination_id
108
109
  dispatch_plan_id
109
110
  quantity
@@ -7,6 +7,7 @@ module Cats
7
7
  belongs_to :destination, class_name: "Cats::Core::Stack"
8
8
 
9
9
  validates :transaction_date, presence: true
10
+ validates :receipt_number, uniqueness: true
10
11
  validates :quantity, presence: true, numericality: {greater_than: 0}
11
12
  validates :receipt_number, presence: true
12
13
  validate :validate_receipt, :validate_quantity
@@ -9,7 +9,7 @@ module Cats
9
9
  delegate(:code, to: :destination, prefix: true)
10
10
  delegate(:abbreviation, to: :unit, prefix: true)
11
11
 
12
- validate :validate_commodity
12
+ validate :validate_commodity, :validate_quantity
13
13
 
14
14
  def validate_commodity
15
15
  return unless source && destination
@@ -19,14 +19,30 @@ module Cats
19
19
  errors.add(:commodity, "batch number should be the same.")
20
20
  end
21
21
 
22
+ def validate_quantity
23
+ return unless quantity.present? && source.present?
24
+
25
+ dispatched = StackTransaction.where(source: source, status: DRAFT)
26
+ total_dispatched = dispatched.reduce(0) do |_sum, rec|
27
+ UnitConversion.convert(source.unit, Cats::Core::UnitOfMeasure.find(rec.unit_id), rec.quantity)
28
+ end
29
+ available = source.quantity - total_dispatched
30
+ available += UnitConversion.convert(source.unit, unit, quantity_was) if quantity_was
31
+
32
+ converted_quantity = UnitConversion.convert(source.unit, Cats::Core::UnitOfMeasure.find(unit_id), quantity)
33
+
34
+ errors.add(:quantity, "total is higher than source quantity (Max = #{available}).") if converted_quantity > available
35
+ end
36
+
22
37
  def commit
23
38
  StackTransaction.transaction do
39
+ self.status = COMMITTED
40
+ save!
24
41
  source.quantity -= UnitConversion.convert(unit, source.unit, quantity)
25
42
  source.save!
26
43
  destination.quantity += UnitConversion.convert(unit, destination.unit, quantity)
44
+ destination.stack_status = Stack::ALLOCATED if destination.stack_status == Stack::RESERVED
27
45
  destination.save!
28
- self.status = COMMITTED
29
- save!
30
46
  end
31
47
  end
32
48
  end
@@ -1,12 +1,17 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportContract < ApplicationRecord
4
+ ACTIVE = "Active".freeze
5
+ CANCELLED = "Cancelled".freeze
6
+ CONTRACT_STATUSES = [ACTIVE, CANCELLED].freeze
7
+
4
8
  belongs_to :transporter
5
9
  belongs_to :transport_bid
6
10
  has_many :contract_items
7
11
 
8
12
  validates :contract_no, presence: true, uniqueness: true
9
13
  validates :contract_date, :expires_on, presence: true
14
+ validates :status, presence: true, inclusion: {in: CONTRACT_STATUSES}
10
15
 
11
16
  delegate(:name, to: :transporter, prefix: true)
12
17
  delegate(:reference_no, to: :transport_bid, prefix: :bid)
@@ -5,6 +5,10 @@ module Cats
5
5
  APPROVED = "Approved".freeze
6
6
  STATUSES = [DRAFT, APPROVED].freeze
7
7
 
8
+ ACTIVE = "Active".freeze
9
+ CANCELLED = "Cancelled".freeze
10
+ ORDER_STATUSES = [ACTIVE, CANCELLED].freeze
11
+
8
12
  belongs_to :transport_requisition
9
13
  belongs_to :prepared_by, class_name: "Cats::Core::User"
10
14
  belongs_to :approved_by, class_name: "Cats::Core::User", optional: true
@@ -12,7 +16,8 @@ module Cats
12
16
  has_many :transport_order_items
13
17
 
14
18
  validates :status, presence: true, inclusion: {in: STATUSES}
15
- validates :order_date, presence: true
19
+ validates :order_status, presence: true, inclusion: {in: ORDER_STATUSES}
20
+ validates :order_date, :order_no, presence: true
16
21
  validate :validate_against_requisition, :validate_status
17
22
 
18
23
  delegate(:full_name, to: :prepared_by, prefix: true)
@@ -1,18 +1,27 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportOrderItem < ApplicationRecord
4
+ ACTIVE = "Active".freeze
5
+ CANCELLED = "Cancelled".freeze
6
+
7
+ ORDER_ITEM_STATUSES = [ACTIVE, CANCELLED].freeze
4
8
  belongs_to :transport_order
5
9
  belongs_to :transporter
6
10
  belongs_to :transport_requisition_item
7
11
  belongs_to :transport_contract, optional: true
12
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
13
+ belongs_to :route
8
14
 
9
- validates :valid_for, presence: true
15
+ validates :valid_for, :quantity, presence: true
10
16
  validates :valid_for, numericality: {greater_than: 0}
17
+ validates :status, presence: true, inclusion: {in: ORDER_ITEM_STATUSES}
11
18
  validates :transport_requisition_item_id, uniqueness: true
12
19
  validate :validate_requisition
13
20
 
14
21
  delegate(:name, to: :transporter, prefix: true)
15
- delegate(:contract_no, to: :transport_contract, prefix: false)
22
+ delegate(:name, to: :route, prefix: true)
23
+ delegate(:abbreviation, to: :unit, prefix: true)
24
+ delegate(:contract_no, to: :transport_contract, prefix: false, allow_nil: true)
16
25
 
17
26
  def validate_requisition
18
27
  return unless transport_requisition_item
@@ -8,6 +8,7 @@ module Cats
8
8
  def message
9
9
  authorization = params[:receipt_authorization]
10
10
  dispatch = authorization.dispatch
11
+ ref_no = dispatch.dispatch_plan_item.dispatch_plan.upstream ? dispatch.dispatch_transactions[0].reference_no : dispatch.reference_no
11
12
  commodity = dispatch.dispatch_plan_item.commodity
12
13
  title = "Receipt Authorization Notification - #{commodity.name}"
13
14
  date = Date.today
@@ -15,7 +16,7 @@ module Cats
15
16
  body = <<~BODY
16
17
  Commodity with the following details has been dispatched to you:
17
18
  Authorization no. = #{dispatch.dispatch_plan_item.reference_no}
18
- Dispatch Ref. = #{dispatch.reference_no}
19
+ Dispatch Ref. = #{ref_no}
19
20
  Batch No. = #{commodity.batch_no}
20
21
  Commodity = #{commodity.name}
21
22
  Quantity = #{authorization.quantity}
@@ -4,7 +4,7 @@ module Cats
4
4
  attributes :id, :reference_no, :dispatch_plan_id, :plan_reference_no, :source_id, :source_name, :destination_id,
5
5
  :destination_name, :quantity, :source_location_type, :destination_location_type, :commodity_status,
6
6
  :status, :commodity_id, :commodity_name, :commodity_batch_no, :unit_abbreviation,
7
- :commodity_shipping_reference, :unit_id, :woreda, :zone, :region
7
+ :commodity_shipping_reference, :unit_id, :woreda, :zone, :region, :beneficiaries
8
8
  end
9
9
  end
10
10
  end
@@ -87,6 +87,7 @@ module Cats
87
87
  woreda: detail.beneficiary_round_plan_item.round_plan_item.woreda.name,
88
88
  fdp: detail.beneficiary_round_plan_item.round_plan_item.fdp.name,
89
89
  commodity_category: detail.round_ration.commodity_category.name,
90
+ beneficiaries: detail.beneficiary_round_plan_item.beneficiaries,
90
91
  unit_id: detail.unit_id,
91
92
  unit: detail.unit.abbreviation,
92
93
  quantity: detail.quantity,
@@ -132,6 +133,7 @@ module Cats
132
133
  unit_id: item[:unit_id],
133
134
  commodity_id: item[:commodity_id],
134
135
  commodity_status: item[:commodity_status],
136
+ beneficiaries: item[:beneficiaries],
135
137
  status: Cats::Core::DispatchPlanItem::UNAUTHORIZED
136
138
  }
137
139
  end
@@ -0,0 +1,5 @@
1
+ class AddBeneficiariesToCatsCoreDispatchPlanItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cats_core_dispatch_plan_items, :beneficiaries, :integer
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ class AddStatusUnitAndQuantityToTransportOrderItem < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cats_core_transport_order_items, :unit_id, :integer
4
+ add_foreign_key :cats_core_transport_order_items,
5
+ :cats_core_unit_of_measures,
6
+ column: :unit_id, null: false,
7
+ index: {name: "unit_on_toi_indx"}
8
+ add_column :cats_core_transport_order_items, :route_id, :integer
9
+ add_foreign_key :cats_core_transport_order_items,
10
+ :cats_core_routes,
11
+ column: :route_id, null: false,
12
+ index: {name: "route_on_toi_indx"}
13
+ add_column :cats_core_transport_order_items, :quantity, :float, null: false
14
+ add_column :cats_core_transport_order_items, :status, :string, null: false
15
+ remove_index :cats_core_transport_order_items, :transport_requisition_item_id,
16
+ name: "tri_on_toi_uniq_indx"
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ class AddStatusToTransportOrder < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cats_core_transport_orders, :order_status, :string, null: false, default: "Active"
4
+ add_column :cats_core_transport_orders, :order_no, :string, null: false
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddStatusToContract < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cats_core_transport_contracts, :status, :string, null: false, default: "Active"
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Cats
2
2
  module Core
3
- VERSION = "1.5.28".freeze
3
+ VERSION = "1.5.30".freeze
4
4
  end
5
5
  end
@@ -1,14 +1,17 @@
1
1
  FactoryBot.define do
2
2
  factory :stack_transaction, class: "Cats::Core::StackTransaction" do
3
3
  transient do
4
- unit_of_measure { create(:unit_of_measure) }
5
- commodity { create(:commodity, unit: unit_of_measure) }
4
+ unit_of_measure_1 { create(:unit_of_measure) }
5
+ unit_of_measure_2 { create(:unit_of_measure) }
6
+ commodity { create(:commodity, unit: unit_of_measure_1) }
7
+ unit_conversion_1 { create(:unit_conversion, from: unit_of_measure_1, to: unit_of_measure_2) }
8
+ unit_conversion_2 { create(:unit_conversion, from: unit_of_measure_2, to: unit_of_measure_1) }
6
9
  end
7
- source { association :stack, commodity: commodity }
8
- destination { association :stack, commodity: commodity }
10
+ source { association :stack, commodity: commodity, unit: unit_of_measure_1 }
11
+ destination { association :stack, commodity: commodity, unit: unit_of_measure_2 }
9
12
  transaction_date { Date.today }
10
13
  quantity { 25 }
11
- unit { unit_of_measure }
14
+ unit { unit_of_measure_1 }
12
15
  status { Cats::Core::Transaction::DRAFT }
13
16
  end
14
17
  end
@@ -6,5 +6,6 @@ FactoryBot.define do
6
6
  contract_date { Date.today }
7
7
  expires_on { Date.today + 6.month }
8
8
  payment_term { FFaker::Name.name }
9
+ status { Cats::Core::TransportContract::ACTIVE }
9
10
  end
10
11
  end
@@ -5,5 +5,9 @@ FactoryBot.define do
5
5
  transport_contract
6
6
  transport_requisition_item { transport_order.transport_requisition.transport_requisition_items.first }
7
7
  valid_for { 10 }
8
+ quantity { 12 }
9
+ status { Cats::Core::TransportOrderItem::ACTIVE }
10
+ unit factory: :unit_of_measure
11
+ route
8
12
  end
9
13
  end
@@ -5,5 +5,7 @@ FactoryBot.define do
5
5
  approved_by factory: :user
6
6
  order_date { Date.today }
7
7
  status { Cats::Core::TransportOrder::DRAFT }
8
+ order_status { Cats::Core::TransportOrder::ACTIVE }
9
+ order_no { "2/2024/TNA/REQ-001" }
8
10
  end
9
11
  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.5.28
4
+ version: 1.5.30
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-12-06 00:00:00.000000000 Z
11
+ date: 2024-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -531,6 +531,10 @@ files:
531
531
  - db/migrate/20221024081141_add_reference_no_to_cats_core_dispatch_transactions.rb
532
532
  - db/migrate/20230102064317_add_receipt_number_to_cats_core_receipt_transactions.rb
533
533
  - db/migrate/20231129071520_create_cats_core_inventory_adjustments.rb
534
+ - db/migrate/20231227114358_add_beneficiaries_to_cats_core_dispatch_plan_items.rb
535
+ - db/migrate/20240125051557_add_status_unit_and_quantity_to_transport_order_item.rb
536
+ - db/migrate/20240125051632_add_status_to_transport_order.rb
537
+ - db/migrate/20240125051644_add_status_to_contract.rb
534
538
  - lib/cats/core.rb
535
539
  - lib/cats/core/engine.rb
536
540
  - lib/cats/core/version.rb