comee_core 0.1.27 → 0.1.28

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: 5137848142d039d57337eab4f356690f8a3980537eb66855509555fe129421a5
4
- data.tar.gz: cd8d1a97afc51a5f693ab8cc6890457ecd95d06ed7fe2a7e9c84a14a1f07f047
3
+ metadata.gz: 4584d0f6f728f6ab957e59500e8a8af4564e0922558df83cb7562e9d9b094603
4
+ data.tar.gz: 5404312320bbcf4d482e5261a6c960dc1418d1e9051c1cfa810419cd872fef7b
5
5
  SHA512:
6
- metadata.gz: 67574412a78a311d4d268ef7a51dd68ef1b9263d4c25df5cde085f5c3e9a44878765025804aa43fc687f5160632eaabddf8dbeadc13969cf5ed50d2c7b2e1dea
7
- data.tar.gz: 4a0202a3b0a1dfd624fd785c5822577774a374771d8121039061204c3e5860d4303a3c6436122aeadb19ed715f1be62acc45b05bd00273927c3e7715f12526c1
6
+ metadata.gz: 86745d97fac73d6fc66de542291014f4c1b6b57fb61bac5c8c31f523b7be03728b3109fad94750100ad40c6cbdca0305e448baaa5d399c52208ddb14ff2921a0
7
+ data.tar.gz: d4013f260e88c21628dc3eb1434718e949f3132e77b77d1daa58554fe6f33339da882772c43e6f6efc45d5d07230b0255b08b4fffa96cf7a91a179b0f6f6ab9c
@@ -16,6 +16,51 @@ module Comee
16
16
  def self.ransackable_associations(_auth_object = nil)
17
17
  []
18
18
  end
19
+
20
+ def submit
21
+ self.status = WarehouseShipment.statuses[:submitted]
22
+ save!
23
+ self
24
+ end
25
+
26
+ def acknowledge
27
+ error = "Warehouse shipment should have a `submitted` status before acknowledgement."
28
+ raise(StandardError, error) unless WarehouseShipment.statuses[status] == WarehouseShipment.statuses[:submitted]
29
+
30
+ self.status = WarehouseShipment.statuses[:acknowledged]
31
+ save!
32
+ items = warehouse_shipment_items.includes(:sales_order_item)
33
+ return self unless items.count.positive?
34
+
35
+ updates = items.map do |item|
36
+ order_item = item.sales_order_item
37
+ {
38
+ id: order_item.id,
39
+ sales_order_id: order_item.sales_order_id,
40
+ product_id: order_item.product_id,
41
+ quantity: order_item.quantity,
42
+ quantity_en_route: order_item.quantity_en_route + item.quantity,
43
+ quantity_remaining: order_item.quantity_remaining - item.quantity,
44
+ price: order_item.price,
45
+ delivery_date: order_item.delivery_date
46
+ }
47
+ end
48
+ SalesOrderItem.upsert_all(updates)
49
+ self
50
+ end
51
+
52
+ def deliver
53
+ error = "Warehouse shipment should have an `acknowledged` status before delivery."
54
+ raise(StandardError, error) unless WarehouseShipment.statuses[status] == WarehouseShipment.statuses[:acknowledged]
55
+
56
+ self.status = WarehouseShipment.statuses[:delivered]
57
+ save!
58
+ order_items = warehouse_shipment_items.includes(:sales_order_item).map(&:sales_order_item)
59
+ return self unless order_items.count.positive?
60
+
61
+ SalesOrderItem.where(id: order_items.map(&:id)).update_all(quantity_en_route: 0)
62
+ self
63
+ end
19
64
  end
20
65
  end
21
66
  end
@@ -1,25 +1,36 @@
1
1
  module Comee
2
2
  module Core
3
3
  class WarehouseShipmentItem < ApplicationRecord
4
- after_create :update_inventory_and_sales_order_item
4
+ before_save :update_inventory
5
5
 
6
6
  belongs_to :warehouse_shipment
7
7
  belongs_to :sales_order_item
8
8
 
9
9
  validates :quantity, presence: true
10
+ validate :validate_inventory_quantity
10
11
 
11
- def update_inventory_and_sales_order_item
12
- update_inventory(sales_order_item.product_id, quantity)
12
+ def validate_inventory_quantity
13
+ return unless quantity && sales_order_item
13
14
 
14
- sales_order_item.update_quantity_en_route(quantity)
15
+ inventory = Inventory.find_by(product_id: sales_order_item.product_id)
16
+ unless inventory
17
+ errors.add(:base, "Inventory entry not found for product `#{sales_order_item.product.name}`.")
18
+ return
19
+ end
20
+
21
+ old_quantity = quantity_was || 0
22
+ diff = inventory.quantity - (quantity - old_quantity)
23
+ errors.add(:quantity, "exceeds available quantity in inventory by #{diff.abs}.") if diff.negative?
15
24
  end
16
25
 
17
- def update_inventory(product_id, quantity_change)
18
- inventory = Inventory.find_by(product_id: product_id)
19
- return unless inventory
26
+ def update_inventory
27
+ inventory = Inventory.find_by(product_id: sales_order_item.product_id)
28
+ return unless quantity_changed?
20
29
 
21
- inventory.quantity -= quantity_change
22
- inventory.save
30
+ old_quantity = quantity_was || 0
31
+ diff = quantity - old_quantity
32
+ inventory.quantity -= diff
33
+ inventory.save!
23
34
  end
24
35
  end
25
36
  end
@@ -1,5 +1,5 @@
1
1
  module Comee
2
2
  module Core
3
- VERSION = "0.1.27".freeze
3
+ VERSION = "0.1.28".freeze
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :inventory, class: "Comee::Core::Inventory" do
3
- quantity { 10 }
3
+ quantity { 200 }
4
4
  product
5
5
  end
6
6
  end
@@ -4,8 +4,14 @@ FactoryBot.define do
4
4
  product
5
5
  quantity { 100 }
6
6
  quantity_en_route { 0 }
7
- quantity_remaining { 100 }
7
+ quantity_remaining { quantity }
8
8
  price { 50 }
9
9
  delivery_date { Date.current.advance(months: 1) }
10
+
11
+ trait :with_inventory do
12
+ after(:create) do |item|
13
+ create(:inventory, product: item.product, quantity: item.quantity + 100)
14
+ end
15
+ end
10
16
  end
11
17
  end
@@ -1,7 +1,7 @@
1
1
  FactoryBot.define do
2
2
  factory :warehouse_shipment_item, class: "Comee::Core::WarehouseShipmentItem" do
3
+ association :sales_order_item, :with_inventory
3
4
  warehouse_shipment
4
- sales_order_item
5
5
  quantity { 10 }
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: comee_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.27
4
+ version: 0.1.28
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-10-25 00:00:00.000000000 Z
11
+ date: 2023-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers