cats_core 1.2.31 → 1.2.32

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: 6c2bd0f123f3f3c2ea21cd6987d61a19839bd8b60519ee8853ae00b163a2ff9c
4
- data.tar.gz: e6825f6847ea16a205fbee1bcfe5d74bf546cbad91dd5ae2c0b42e38d33eb806
3
+ metadata.gz: 28dccafb9f531a0e9c13331b7a3c0cb807ddfeb42504bb1b484e58837c852219
4
+ data.tar.gz: 92f65296583c53ef16ac6e07fc849b6541fa5d69ba0f8d5f1b2920b16bdd2924
5
5
  SHA512:
6
- metadata.gz: d62649ef9300dbcac14b73ea849e1cda359b4e78a2d62ece62bb4df13d623c0e6f0ed435dabd48e35cae417baaaa5476975d8bdc5b6d9d7be05b4a972e4c9b7a
7
- data.tar.gz: 535bc18ed18dd49dfeba9e8f58b966ee46690a7218293380658e9aa5ded0812ac20f47d9c474deaacc7f174ad3aae76d8da7e61f023f1bd376b4946ac5dc611a
6
+ metadata.gz: aa1f417bf917a6d670ac4e787343b520650f46d05d43ec77cd0b747484b3114abee8f03136b9aa71f247b188dfc4a062c6710c8dda44f29b4ba47f20dc271ed5
7
+ data.tar.gz: 8583a0ba4f7354469161c43e95fe150a3156b4ec3c1c08b0f0ed1f44924e7b7a620a763dd02c134b6a0c8c0ce34b6f2075e21d0209e43e3f5b392365b341f834
@@ -0,0 +1,26 @@
1
+ module Cats
2
+ module Core
3
+ class OfferItem < ApplicationRecord
4
+ belongs_to :transport_offer
5
+ belongs_to :transport_bid_item
6
+
7
+ validates :price, presence: true, numericality: { greater_than: 0 }
8
+ validates :rank, numericality: { greater_than: 0 }, allow_nil: true
9
+ validate :validate_rank_is_set_for_winner
10
+
11
+ def mark_as_winner(rank)
12
+ raise(StandardError, 'Offer item already marked as winner.') if winner
13
+
14
+ self.rank = rank
15
+ self.winner = true
16
+ save!
17
+ end
18
+
19
+ def validate_rank_is_set_for_winner
20
+ return if rank
21
+
22
+ errors.add(:winner, 'cannot be set for a non-ranked offer item.') if winner
23
+ end
24
+ end
25
+ end
26
+ end
@@ -8,13 +8,22 @@ module Cats
8
8
  WINNERS_DECLARED = 'Winner Declared'.freeze
9
9
  STATUSES = [NEW, OPEN, CLOSED, RANKED, WINNERS_DECLARED].freeze
10
10
 
11
+ # Bid types
12
+ REGIONAL = 'Regional'.freeze
13
+ NON_REGIONAL = 'Non Regional'.freeze
14
+ BID_TYPES = [REGIONAL, NON_REGIONAL].freeze
15
+
11
16
  has_many :transport_bid_items
12
- has_many :transport_offers, through: :transport_bid_items
17
+ has_many :transport_offers
18
+ belongs_to :region, class_name: 'Cats::Core::Location', optional: true
13
19
 
14
20
  validates :reference_no, presence: true, uniqueness: true
15
- validates :start_date, :end_date, :status, presence: true
21
+ validates :start_date, :end_date, :status, :bid_type, :bid_bond_amount, presence: true
22
+ validates :bid_bond_amount, numericality: { greater_than_or_equal_to: 0 }
16
23
  validates :status, inclusion: { in: STATUSES }
24
+ validates :bid_type, inclusion: { in: BID_TYPES }
17
25
  validate :validate_start_date_against_end_date
26
+ validate :validate_region
18
27
 
19
28
  def validate_start_date_against_end_date
20
29
  return unless start_date && end_date
@@ -22,6 +31,16 @@ module Cats
22
31
  errors.add(:start_date, 'should be before end date.') if start_date >= end_date
23
32
  end
24
33
 
34
+ def validate_region
35
+ return unless bid_type
36
+
37
+ errors.add(:region, 'should be null.') if bid_type == NON_REGIONAL && region
38
+
39
+ errors.add(:region, 'should not be null.') if bid_type == REGIONAL && !region
40
+
41
+ errors.add(:region, 'is not valid.') if region && region.location_type != Location::REGION
42
+ end
43
+
25
44
  def open
26
45
  raise(StandardError, 'Bid is already open.') if status == OPEN
27
46
 
@@ -5,7 +5,7 @@ module Cats
5
5
  belongs_to :route
6
6
  belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure', optional: true
7
7
 
8
- has_many :transport_offers
8
+ has_many :offer_items
9
9
 
10
10
  validates :quantity, presence: true, numericality: { greater_than: 0 }
11
11
 
@@ -1,28 +1,15 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportOffer < ApplicationRecord
4
- belongs_to :transport_bid_item
4
+ belongs_to :transport_bid
5
5
  belongs_to :transporter
6
+ has_many :offer_items
6
7
 
7
- validates :price, presence: true, numericality: { greater_than: 0 }
8
- validates :rank, numericality: { greater_than: 0 }, allow_nil: true
9
- validate :validate_rank_is_set_for_winner
8
+ validates :offer_date, :bid_bond_amount, presence: true
9
+ validates :bid_bond_amount, numericality: { greater_than_or_equal_to: 0 }
10
10
 
11
11
  delegate(:name, to: :transporter, prefix: true)
12
-
13
- def mark_as_winner(rank)
14
- raise(StandardError, 'Offer already marked as winner.') if winner
15
-
16
- self.rank = rank
17
- self.winner = true
18
- save!
19
- end
20
-
21
- def validate_rank_is_set_for_winner
22
- return if rank
23
-
24
- errors.add(:winner, 'cannot be set for a non-ranked offer.') if winner
25
- end
12
+ delegate(:reference_no, to: :transport_bid, prefix: 'bid')
26
13
  end
27
14
  end
28
15
  end
@@ -6,6 +6,12 @@ class CreateCatsCoreTransportBids < ActiveRecord::Migration[6.1]
6
6
  t.date :start_date, null: false
7
7
  t.date :end_date, null: false
8
8
  t.string :status, null: false, default: 'New'
9
+ t.string :bid_type, null: false, default: 'Regional'
10
+ t.references :region,
11
+ null: true,
12
+ index: { name: 'region_on_tb_indx' },
13
+ foreign_key: { to_table: :cats_core_locations }
14
+ t.float :bid_bond_amount, null: false, default: 0
9
15
 
10
16
  t.timestamps
11
17
  end
@@ -1,17 +1,16 @@
1
1
  class CreateCatsCoreTransportOffers < ActiveRecord::Migration[6.1]
2
2
  def change
3
3
  create_table :cats_core_transport_offers do |t|
4
- t.references :transport_bid_item,
4
+ t.references :transport_bid,
5
5
  null: false,
6
- index: { name: 'to_on_tbi_indx' },
7
- foreign_key: { to_table: :cats_core_transport_bid_items }
6
+ index: { name: 'to_on_tb_indx' },
7
+ foreign_key: { to_table: :cats_core_transport_bids }
8
8
  t.references :transporter,
9
9
  null: false,
10
10
  index: { name: 'to_on_transporter_indx' },
11
11
  foreign_key: { to_table: :cats_core_transporters }
12
- t.float :price, null: false
13
- t.boolean :winner, null: false, default: false
14
- t.integer :rank
12
+ t.date :offer_date, null: false
13
+ t.float :bid_bond_amount, null: false, default: 0
15
14
 
16
15
  t.timestamps
17
16
  end
@@ -0,0 +1,19 @@
1
+ class CreateCatsCoreOfferItems < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :cats_core_offer_items do |t|
4
+ t.references :transport_offer,
5
+ null: false,
6
+ index: { name: 'to_on_oi_indx' },
7
+ foreign_key: { to_table: :cats_core_transport_offers }
8
+ t.references :transport_bid_item,
9
+ null: false,
10
+ index: { name: 'tbi_on_to_indx' },
11
+ foreign_key: { to_table: :cats_core_transport_bid_items }
12
+ t.float :price, null: false
13
+ t.boolean :winner, null: false, default: false
14
+ t.integer :rank
15
+
16
+ t.timestamps
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  module Cats
2
2
  module Core
3
- VERSION = '1.2.31'.freeze
3
+ VERSION = '1.2.32'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :offer_item, class: 'Cats::Core::OfferItem' do
3
+ transport_offer
4
+ transport_bid_item
5
+ price { 150 }
6
+ rank { 2 }
7
+ winner { false }
8
+ end
9
+ end
@@ -4,5 +4,8 @@ FactoryBot.define do
4
4
  description { FFaker::Name.name }
5
5
  start_date { Date.today - 1.week }
6
6
  end_date { Date.today }
7
+ bid_type { Cats::Core::TransportBid::REGIONAL }
8
+ region factory: :location
9
+ bid_bond_amount { 100 }
7
10
  end
8
11
  end
@@ -1,9 +1,8 @@
1
1
  FactoryBot.define do
2
2
  factory :transport_offer, class: 'Cats::Core::TransportOffer' do
3
- transport_bid_item
3
+ transport_bid
4
4
  transporter
5
- price { 100 }
6
- winner { false }
7
- rank { nil }
5
+ bid_bond_amount { 100 }
6
+ offer_date { Date.today }
8
7
  end
9
8
  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.2.31
4
+ version: 1.2.32
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-12-23 00:00:00.000000000 Z
11
+ date: 2021-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -271,6 +271,7 @@ files:
271
271
  - app/models/cats/core/menu_item.rb
272
272
  - app/models/cats/core/notification.rb
273
273
  - app/models/cats/core/notification_rule.rb
274
+ - app/models/cats/core/offer_item.rb
274
275
  - app/models/cats/core/operator.rb
275
276
  - app/models/cats/core/plan.rb
276
277
  - app/models/cats/core/plan_item.rb
@@ -368,7 +369,8 @@ files:
368
369
  - db/migrate/20211030133752_add_status_to_cats_core_commodities.rb
369
370
  - db/migrate/20211215121151_create_cats_core_transport_bids.rb
370
371
  - db/migrate/20211215124452_create_cats_core_transport_bid_items.rb
371
- - db/migrate/20211229160126_create_cats_core_transport_offers.rb
372
+ - db/migrate/20211229160125_create_cats_core_transport_offers.rb
373
+ - db/migrate/20211229160126_create_cats_core_offer_items.rb
372
374
  - db/migrate/20211229160127_create_cats_core_transport_contracts.rb
373
375
  - db/migrate/20211229160128_create_cats_core_contract_items.rb
374
376
  - db/migrate/20211229160129_create_cats_core_commodity_substitutions.rb
@@ -397,6 +399,7 @@ files:
397
399
  - spec/factories/cats/core/menus.rb
398
400
  - spec/factories/cats/core/notification_rules.rb
399
401
  - spec/factories/cats/core/notifications.rb
402
+ - spec/factories/cats/core/offer_items.rb
400
403
  - spec/factories/cats/core/operators.rb
401
404
  - spec/factories/cats/core/plan_item_details.rb
402
405
  - spec/factories/cats/core/plan_items.rb