comee_core 0.2.96 → 0.2.97

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/comee/core/goods_received_notes_controller.rb +22 -0
  3. data/app/controllers/comee/core/stock_transfer_request_items_controller.rb +18 -0
  4. data/app/controllers/comee/core/stock_transfer_requests_controller.rb +19 -0
  5. data/app/controllers/comee/core/store_items_controller.rb +18 -0
  6. data/app/controllers/comee/core/stores_controller.rb +18 -0
  7. data/app/models/comee/core/goods_issued_item.rb +14 -0
  8. data/app/models/comee/core/goods_issued_note.rb +11 -0
  9. data/app/models/comee/core/goods_received_note.rb +28 -0
  10. data/app/models/comee/core/received_item.rb +22 -0
  11. data/app/models/comee/core/reorder_report.rb +27 -0
  12. data/app/models/comee/core/reorder_report_item.rb +18 -0
  13. data/app/models/comee/core/stock_transfer_request.rb +52 -0
  14. data/app/models/comee/core/stock_transfer_request_item.rb +22 -0
  15. data/app/models/comee/core/store.rb +14 -0
  16. data/app/models/comee/core/store_item.rb +18 -0
  17. data/app/serializers/comee/core/goods_received_note_serializer.rb +8 -0
  18. data/app/serializers/comee/core/stock_transfer_request_item_serializer.rb +9 -0
  19. data/app/serializers/comee/core/stock_transfer_request_serializer.rb +12 -0
  20. data/app/serializers/comee/core/store_item_serializer.rb +9 -0
  21. data/app/serializers/comee/core/store_serializer.rb +8 -0
  22. data/app/services/comee/core/goods_received_note_service.rb +69 -0
  23. data/config/routes.rb +30 -0
  24. data/db/migrate/20240401115953_create_comee_core_stores.rb +16 -0
  25. data/db/migrate/20240401123233_create_comee_core_store_items.rb +18 -0
  26. data/db/migrate/20240401124757_create_comee_core_stock_transfer_requests.rb +29 -0
  27. data/db/migrate/20240401131549_create_comee_core_stock_transfer_request_items.rb +17 -0
  28. data/db/migrate/20240401192505_create_comee_core_reorder_reports.rb +14 -0
  29. data/db/migrate/20240401193503_create_comee_core_reorder_report_items.rb +17 -0
  30. data/db/migrate/20240406120401_create_comee_core_goods_received_notes.rb +17 -0
  31. data/db/migrate/20240406124821_create_comee_core_received_items.rb +21 -0
  32. data/db/migrate/20240406142113_create_comee_core_goods_issued_notes.rb +14 -0
  33. data/db/migrate/20240406162711_create_comee_core_goods_issued_items.rb +17 -0
  34. data/lib/comee/core/version.rb +1 -1
  35. data/spec/factories/comee/core/goods_issued_items.rb +7 -0
  36. data/spec/factories/comee/core/goods_issued_notes.rb +7 -0
  37. data/spec/factories/comee/core/goods_received_notes.rb +11 -0
  38. data/spec/factories/comee/core/received_items.rb +10 -0
  39. data/spec/factories/comee/core/reorder_report_items.rb +7 -0
  40. data/spec/factories/comee/core/reorder_reports.rb +7 -0
  41. data/spec/factories/comee/core/stock_transfer_request_items.rb +7 -0
  42. data/spec/factories/comee/core/stock_transfer_requests.rb +13 -0
  43. data/spec/factories/comee/core/store_items.rb +8 -0
  44. data/spec/factories/comee/core/stores.rb +9 -0
  45. metadata +43 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56540db3f29e0545bc613264651f3f23caece20fb82c6d16b0a9ce27a81bf1d4
4
- data.tar.gz: 93295f483e5ab06207c5c8bfa7d44849b77da0d273e535ea82f876b463d601f3
3
+ metadata.gz: 5c8e51d4338bca0293010bb351722f44c8f2f653eb8afe8aca1b9abf152b2f98
4
+ data.tar.gz: b11f9d292f843c1798812e9f8fdf9447f13c34b6543f1f4c2d4d30e7bff413bb
5
5
  SHA512:
6
- metadata.gz: b09dd1bc4623d8832f1e7af935ffce50a379b77c25c258f28418d8bd4c9266e1e7efcfa96342c3a2faedd00b43c3f9b3f23586c050f7733e7ce4e6e193cb953c
7
- data.tar.gz: fcf183ea8a7a693b066481bb5af3001e8b5ca9952a72639ca44f84d07e59b0c0df8c5c23aa0e819036594a2d05d1796126a1847371e6e4c74d6b84170c94e49f
6
+ metadata.gz: 04d1973d5085f0961d4c47f569eeebdb7b7aea89f1c6b65c926095b027f9da10251bd77fbef14883bf8f681a25e12de5bf1938d75f8e22c64af6999d1a47ae1c
7
+ data.tar.gz: b211b69a816ece7e4354e9e81f643683d9f3b491041b404838e89d2f5730ac8d3744f07edc3c70f6915ec6cb347da77e2a4e58dc0c2313d0e19e66cc6109fda2
@@ -0,0 +1,22 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsReceivedNotesController < ApplicationController
4
+ include Common
5
+
6
+ def generate
7
+ service = GoodsReceivedNoteService.new
8
+ grn = service.generate_received_note(params[:id])
9
+ render_content(grn)
10
+ rescue StandardError => e
11
+ render json: {success: false, error: e.message}
12
+ end
13
+
14
+ private
15
+
16
+ def model_params
17
+ params.require(:payload).permit(:grn_number, :date_of_receipt, :total_quantity, :total_amount, :received_condition, :comments,
18
+ :purchase_order_id)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequestItemsController < ApplicationController
4
+ include Common
5
+
6
+ def filter
7
+ data = StockTransferRequestItem.ransack(params[:q]).result
8
+ render_content(data)
9
+ end
10
+
11
+ private
12
+
13
+ def model_params
14
+ params.require(:payload).permit(:quantity, :sales_order_item_id, :stock_transfer_request_id)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequestsController < ApplicationController
4
+ include Common
5
+
6
+ def filter
7
+ data = StockTransferRequest.ransack(params[:q]).result
8
+ render_content(data)
9
+ end
10
+
11
+ private
12
+
13
+ def model_params
14
+ params.require(:payload).permit(:reference_number, :reference_date, :due_date, :remark, :status, :from_id, :to_id,
15
+ :initiated_by_id, :sales_order_id)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Comee
2
+ module Core
3
+ class StoreItemsController < ApplicationController
4
+ include Common
5
+
6
+ def filter
7
+ data = StoreItem.ransack(params[:q]).result
8
+ render_content(data)
9
+ end
10
+
11
+ private
12
+
13
+ def model_params
14
+ params.require(:payload).permit(:quantity, :reorder_threshold, :product_id, :store_id)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Comee
2
+ module Core
3
+ class StoresController < ApplicationController
4
+ include Common
5
+
6
+ def filter
7
+ data = Store.ransack(params[:q]).result
8
+ render_content(data)
9
+ end
10
+
11
+ private
12
+
13
+ def model_params
14
+ params.require(:payload).permit(:code, :name, :address, :email, :warehouse_manager_id)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsIssuedItem < ApplicationRecord
4
+ belongs_to :stock_transfer_request_item
5
+ belongs_to :goods_issued_note
6
+
7
+ def product
8
+ stock_transfer_request_item.sales_order_item.product
9
+ end
10
+
11
+ validates :quantity, presence: true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsIssuedNote < ApplicationRecord
4
+ belongs_to :stock_transfer_request
5
+ has_many :goods_issued_items
6
+
7
+ validates :gin_number, :stock_transfer_request, uniqueness: true
8
+ validates :date_issued, :gin_number, presence: true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsReceivedNote < ApplicationRecord
4
+ before_create :set_grn_number
5
+ belongs_to :purchase_order
6
+ has_many :received_items
7
+
8
+ validates :grn_number, uniqueness: true
9
+ validates :date_of_receipt, presence: true
10
+ validates :total_quantity, :total_amount, presence: true, numericality: {greater_than_or_equal_to: 0}
11
+
12
+ private
13
+
14
+ def set_grn_number
15
+ self.grn_number = generate_grn_number
16
+ end
17
+
18
+ def generate_grn_number
19
+ loop do
20
+ number = SecureRandom.random_number(10000000)
21
+ grn_number = "GRN-#{number}"
22
+
23
+ break grn_number unless GoodsReceivedNote.where(grn_number: grn_number).exists?
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module Comee
2
+ module Core
3
+ class ReceivedItem < ApplicationRecord
4
+ belongs_to :goods_received_note
5
+ belongs_to :purchase_order_item
6
+ before_save :update_total_price
7
+ validate :check_quantity_received
8
+
9
+ validates :quantity_ordered, :quantity_received, :unit_price, :total_price, presence: true,
10
+ numericality: {greater_than_or_equal_to: 0}
11
+
12
+ def update_total_price
13
+ self.total_price ||= 0
14
+ self.total_price = unit_price * quantity_received
15
+ end
16
+
17
+ def check_quantity_received
18
+ errors.add(:quantity_received, "can't be greater than quantity ordered") if quantity_received.to_i > quantity_ordered.to_i
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ module Comee
2
+ module Core
3
+ class ReorderReport < ApplicationRecord
4
+ before_create :set_reference_number
5
+ belongs_to :store
6
+ has_many :reorder_report_items
7
+
8
+ validates :report_date, presence: true
9
+ validates :reference_number, uniqueness: true
10
+
11
+ private
12
+
13
+ def set_reference_number
14
+ self.reference_number = generate_reference_number
15
+ end
16
+
17
+ def generate_reference_number
18
+ loop do
19
+ number = SecureRandom.random_number(10000000)
20
+ reference_number = "RR-#{number}"
21
+
22
+ break reference_number unless ReorderReport.where(reference_number: reference_number).exists?
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module Comee
2
+ module Core
3
+ class ReorderReportItem < ApplicationRecord
4
+ belongs_to :reorder_report
5
+ belongs_to :product
6
+
7
+ validates :quantity, presence: true
8
+
9
+ def self.ransackable_attributes(_auth_object = nil)
10
+ %w[created_at id id_value product_id quantity reorder_report_id updated_at]
11
+ end
12
+
13
+ def self.ransackable_associations
14
+ %w[reorder_report product]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,52 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequest < ApplicationRecord
4
+ before_create :set_reference_number
5
+
6
+ belongs_to :from, class_name: "Comee::Core::Store", optional: true
7
+ belongs_to :to, class_name: "Comee::Core::FulfillmentCenter", optional: true
8
+ belongs_to :initiated_by, class_name: "Comee::Core::User", optional: true
9
+ belongs_to :sales_order
10
+ has_many :stock_transfer_request_items
11
+
12
+ validates :reference_number, uniqueness: true
13
+ validates :reference_number, :reference_date, :due_date, :status, presence: true
14
+ validate :validate_due_date_is_after_reference_date, if: -> { due_date.present? && reference_date.present? }
15
+ enum status: {
16
+ draft: 0,
17
+ issued: 1,
18
+ accepted: 2,
19
+ transferred: 3
20
+ }
21
+ def validate_due_date_is_after_reference_date
22
+ return if due_date > reference_date
23
+
24
+ errors.add(:due_date, "must be after reference date")
25
+ end
26
+
27
+ def self.ransackable_attributes(_auth_object = nil)
28
+ %w[created_at due_date from_id id id_value initiated_by_id reference_date reference_number remark
29
+ sales_order_id status to_id updated_at]
30
+ end
31
+
32
+ def self.ransackable_associations(_auth_object = nil)
33
+ %w[from initiated_by sales_order to]
34
+ end
35
+
36
+ private
37
+
38
+ def set_reference_number
39
+ self.reference_number = generate_reference_number
40
+ end
41
+
42
+ def generate_reference_number
43
+ loop do
44
+ number = SecureRandom.random_number(10000000)
45
+ reference_number = "STR-#{number}"
46
+
47
+ break reference_number unless StockTransferRequest.where(reference_number: reference_number).exists?
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,22 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequestItem < ApplicationRecord
4
+ belongs_to :sales_order_item
5
+ belongs_to :stock_transfer_request
6
+
7
+ validates :quantity, presence: true
8
+
9
+ def product
10
+ sales_order_item.product
11
+ end
12
+
13
+ def self.ransackable_attributes(_auth_object = nil)
14
+ %w[created_at id id_value quantity sales_order_item_id stock_transfer_request_id updated_at]
15
+ end
16
+
17
+ def self.ransackable_associations(_auth_object = nil)
18
+ %w[sales_order_item stock_transfer_request]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ module Comee
2
+ module Core
3
+ class Store < ApplicationRecord
4
+ belongs_to :warehouse_manager, class_name: "Comee::Core::User", optional: true
5
+
6
+ validates :name, :address, :email, :code, presence: true
7
+ validates :email, format: {with: URI::MailTo::EMAIL_REGEXP}
8
+
9
+ def self.ransackable_attributes(_auth_object = nil)
10
+ %w[address code created_at email id id_value name updated_at]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ module Comee
2
+ module Core
3
+ class StoreItem < ApplicationRecord
4
+ belongs_to :product
5
+ belongs_to :store
6
+
7
+ validates :quantity, :reorder_threshold, presence: true
8
+
9
+ def self.ransackable_attributes(_auth_object = nil)
10
+ %w[created_at id id_value product_id quantity reorder_threshold store_id updated_at]
11
+ end
12
+
13
+ def self.ransackable_associations(_auth_object = nil)
14
+ %w[product store]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsReceivedNoteSerializer < ActiveModel::Serializer
4
+ attributes :id, :grn_number, :date_of_receipt, :total_quantity, :total_amount, :received_condition, :comments
5
+ belongs_to :purchase_order
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequestItemSerializer < ActiveModel::Serializer
4
+ attributes :id, :quantity, :product
5
+ belongs_to :stock_transfer_request
6
+ belongs_to :sales_order_item
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Comee
2
+ module Core
3
+ class StockTransferRequestSerializer < ActiveModel::Serializer
4
+ attributes :id, :reference_number, :reference_date, :due_date, :remark, :status
5
+ belongs_to :from
6
+ belongs_to :to
7
+ belongs_to :initiated_by
8
+ belongs_to :sales_order
9
+ has_many :stock_transfer_request_items
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Comee
2
+ module Core
3
+ class StoreItemSerializer < ActiveModel::Serializer
4
+ attributes :id, :quantity, :reorder_threshold
5
+ belongs_to :product
6
+ belongs_to :store
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module Comee
2
+ module Core
3
+ class StoreSerializer < ActiveModel::Serializer
4
+ attributes :id, :code, :name, :address, :email
5
+ belongs_to :warehouse_manager
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,69 @@
1
+ module Comee
2
+ module Core
3
+ class GoodsReceivedNoteService
4
+ def generate_received_note(id)
5
+ goods_received_note = nil
6
+
7
+ begin
8
+ purchase_order = PurchaseOrder.find(id)
9
+ rescue ActiveRecord::RecordNotFound
10
+ raise StandardError, "Purchase Order does not exist."
11
+ end
12
+
13
+ if GoodsReceivedNote.exists?(purchase_order: purchase_order)
14
+ raise StandardError, "Goods Received Note already exists for this purchase order"
15
+ end
16
+
17
+ GoodsReceivedNote.transaction do
18
+ purchase_order_items = PurchaseOrderItem.where(purchase_order_id: purchase_order.id)
19
+
20
+ goods_received_note = GoodsReceivedNote.create!(
21
+ date_of_receipt: Date.current,
22
+ total_quantity: 0, # set initial quantity
23
+ total_amount: 0, # set initial amount
24
+ received_condition: "",
25
+ comments: "",
26
+ purchase_order_id: purchase_order.id
27
+ )
28
+
29
+ begin
30
+ ReceivedItem.insert_all(
31
+ purchase_order_items.map do |poi|
32
+ {
33
+ purchase_order_item_id: poi.id,
34
+ goods_received_note_id: goods_received_note.id,
35
+ unit_price: poi.price,
36
+ total_price: poi.total_price,
37
+ quantity_ordered: poi.quantity,
38
+ quantity_received: 0
39
+ }
40
+ end
41
+ )
42
+ rescue StandardError => e
43
+ raise StandardError, "Failed to generate received note items: #{e.message}"
44
+ end
45
+ total_quantity = calculate_grn_total_quantity(goods_received_note)
46
+ total_price = calculate_grn_total_price(goods_received_note)
47
+ goods_received_note.update!(total_amount: total_price, total_quantity: total_quantity)
48
+ end
49
+ goods_received_note
50
+ rescue StandardError
51
+ raise
52
+ end
53
+
54
+ def check_grn_existence(purchase_order)
55
+ return unless GoodsReceivedNote.exists?(purchase_order_id: purchase_order.id)
56
+
57
+ raise(StandardError, "Goods Received Note already exists for this purchase order")
58
+ end
59
+
60
+ def calculate_grn_total_quantity(goods_received_note)
61
+ goods_received_note.received_items.sum(:quantity_received)
62
+ end
63
+
64
+ def calculate_grn_total_price(goods_received_note)
65
+ goods_received_note.received_items.sum(:total_price)
66
+ end
67
+ end
68
+ end
69
+ end
data/config/routes.rb CHANGED
@@ -175,4 +175,34 @@ Comee::Core::Engine.routes.draw do
175
175
  resources :application_modules
176
176
 
177
177
  resources :user_application_roles
178
+
179
+ resources :stores do
180
+ collection do
181
+ post "filter"
182
+ end
183
+ end
184
+
185
+ resources :store_items do
186
+ collection do
187
+ post "filter"
188
+ end
189
+ end
190
+
191
+ resources :stock_transfer_requests do
192
+ collection do
193
+ post "filter"
194
+ end
195
+ end
196
+
197
+ resources :stock_transfer_request_items do
198
+ collection do
199
+ post "filter"
200
+ end
201
+ end
202
+
203
+ resources :goods_received_notes do
204
+ member do
205
+ post "generate"
206
+ end
207
+ end
178
208
  end
@@ -0,0 +1,16 @@
1
+ class CreateComeeCoreStores < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_stores do |t|
4
+ t.string :code, null: false
5
+ t.string :name, null: false
6
+ t.string :address, null: false
7
+ t.string :email, null: false
8
+ t.references :warehouse_manager,
9
+ null: false,
10
+ index: {name: "wm_on_ccstr_indx"},
11
+ foreign_key: {to_table: :comee_core_users}
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ class CreateComeeCoreStoreItems < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_store_items do |t|
4
+ t.float :quantity, null: false
5
+ t.float :reorder_threshold, null: false, default: 10
6
+ t.references :product,
7
+ null: false,
8
+ index: {name: "product_on_ccsi_indx"},
9
+ foreign_key: {to_table: :comee_core_products}
10
+ t.references :store,
11
+ null: false,
12
+ index: {name: "store_on_ccsi_indx"},
13
+ foreign_key: {to_table: :comee_core_stores}
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ class CreateComeeCoreStockTransferRequests < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_stock_transfer_requests do |t|
4
+ t.string :reference_number, null: false
5
+ t.date :reference_date, null: false, default: Date.current
6
+ t.date :due_date, null: false
7
+ t.string :remark
8
+ t.references :from,
9
+ null: false,
10
+ index: {name: "from_on_ccstr_indx"},
11
+ foreign_key: {to_table: :comee_core_stores}
12
+ t.references :to,
13
+ null: false,
14
+ index: {name: "to_on_ccstr_indx"},
15
+ foreign_key: {to_table: :comee_core_fulfillment_centers}
16
+ t.integer :status, null: false, default: 0
17
+ t.references :initiated_by,
18
+ null: false,
19
+ index: {name: "initiated_by_on_ccstr_indx"},
20
+ foreign_key: {to_table: :comee_core_users}
21
+ t.references :sales_order,
22
+ null: false,
23
+ index: {name: "so_on_ccstr_indx"},
24
+ foreign_key: {to_table: :comee_core_sales_orders}
25
+
26
+ t.timestamps
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ class CreateComeeCoreStockTransferRequestItems < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_stock_transfer_request_items do |t|
4
+ t.float :quantity, null: false
5
+ t.references :sales_order_item,
6
+ null: false,
7
+ index: {name: "soi_on_ccsri_indx"},
8
+ foreign_key: {to_table: :comee_core_sales_order_items}
9
+ t.references :stock_transfer_request,
10
+ null: false,
11
+ index: {name: "sri_on_ccsri_indx"},
12
+ foreign_key: {to_table: :comee_core_stock_transfer_requests}
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ class CreateComeeCoreReorderReports < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_reorder_reports do |t|
4
+ t.string :reference_number
5
+ t.date :report_date, null: false, default: Date.current
6
+ t.references :store,
7
+ null: false,
8
+ index: {name: "store_on_ccrr_index"},
9
+ foreign_key: {to_table: :comee_core_stores}
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ class CreateComeeCoreReorderReportItems < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_reorder_report_items do |t|
4
+ t.float :quantity, null: false
5
+ t.references :reorder_report,
6
+ null: false,
7
+ index: {name: "reorder_report_on_ccrri_index"},
8
+ foreign_key: {to_table: :comee_core_reorder_reports}
9
+ t.references :product,
10
+ null: false,
11
+ index: {name: "product_on_ccrri_index"},
12
+ foreign_key: {to_table: :comee_core_products}
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ class CreateComeeCoreGoodsReceivedNotes < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_goods_received_notes do |t|
4
+ t.string :grn_number
5
+ t.string :date_of_receipt
6
+ t.float :total_quantity, null: false
7
+ t.float :total_amount, null: false
8
+ t.string :received_condition
9
+ t.string :comments
10
+ t.references :purchase_order,
11
+ null: false,
12
+ index: {name: "po_on_ccgrn_indx"},
13
+ foreign_key: {to_table: :comee_core_purchase_orders}
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ class CreateComeeCoreReceivedItems < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_received_items do |t|
4
+ t.float :quantity_ordered, null: false
5
+ t.float :quantity_received, null: false
6
+ t.float :unit_price, null: false
7
+ t.float :total_price, null: false
8
+ t.references :goods_received_note,
9
+ null: false,
10
+ index: {name: "grn_on_ccri_indx"},
11
+ foreign_key: {to_table: :comee_core_goods_received_notes}
12
+
13
+ t.references :purchase_order_item,
14
+ null: false,
15
+ index: {name: "poi_on_ccri_indx"},
16
+ foreign_key: {to_table: :comee_core_purchase_order_items}
17
+
18
+ t.timestamps
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ class CreateComeeCoreGoodsIssuedNotes < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_goods_issued_notes do |t|
4
+ t.string :gin_number, null: false
5
+ t.date :date_issued, null: false
6
+ t.references :stock_transfer_request,
7
+ null: false,
8
+ index: {name: "str_on_ccgin_indx"},
9
+ foreign_key: {to_table: :comee_core_stock_transfer_requests}
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ class CreateComeeCoreGoodsIssuedItems < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :comee_core_goods_issued_items do |t|
4
+ t.float :quantity, null: false
5
+ t.references :stock_transfer_request_item,
6
+ null: false,
7
+ index: {name: "stri_on_ccgit_index"},
8
+ foreign_key: {to_table: :comee_core_stock_transfer_request_items}
9
+ t.references :goods_issued_note,
10
+ null: false,
11
+ index: {name: "gin_on_ccgit_index"},
12
+ foreign_key: {to_table: :comee_core_goods_issued_notes}
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  module Comee
2
2
  module Core
3
- VERSION = "0.2.96".freeze
3
+ VERSION = "0.2.97".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :goods_issued_item, class: "Comee::Core::GoodsIssuedItem" do
3
+ quantity { Faker::Number.between(from: 1, to: 20) }
4
+ stock_transfer_request_item
5
+ goods_issued_note
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :goods_issued_note, class: "Comee::Core::GoodsIssuedNote" do
3
+ gin_number { Faker::Alphanumeric.alpha(number: 10) }
4
+ date_issued { Date.current }
5
+ stock_transfer_request
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ FactoryBot.define do
2
+ factory :goods_received_note, class: "Comee::Core::GoodsReceivedNote" do
3
+ grn_number { Faker::Alphanumeric.alpha(number: 10) }
4
+ date_of_receipt { Date.current }
5
+ total_quantity { Faker::Number.between(from: 1, to: 20) }
6
+ total_amount { Faker::Number.between(from: 100, to: 2000) }
7
+ received_condition { Faker::Lorem.word }
8
+ comments { Faker::Lorem.sentence }
9
+ purchase_order
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+ factory :received_item, class: "Comee::Core::ReceivedItem" do
3
+ quantity_ordered { 10 }
4
+ quantity_received { 10 }
5
+ unit_price { Faker::Number.between(from: 100, to: 200) }
6
+ total_price { Faker::Number.between(from: 100, to: 2000) }
7
+ goods_received_note
8
+ purchase_order_item
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :reorder_report_item, class: "Comee::Core::ReorderReportItem" do
3
+ quantity { Faker::Number.between(from: 0, to: 20) }
4
+ reorder_report
5
+ product
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :reorder_report, class: "Comee::Core::ReorderReport" do
3
+ report_date { Date.current }
4
+ reference_number { "RR-#{SecureRandom.random_number(10000000)}" }
5
+ store
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :stock_transfer_request_item, class: "Comee::Core::StockTransferRequestItem" do
3
+ quantity { Faker::Number.between(from: 0, to: 20) }
4
+ sales_order_item
5
+ stock_transfer_request
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ FactoryBot.define do
2
+ factory :stock_transfer_request, class: "Comee::Core::StockTransferRequest" do
3
+ reference_number { Faker::Alphanumeric.alpha(number: 10) }
4
+ reference_date { Date.current }
5
+ due_date { Date.current.advance(days: 10) }
6
+ remark { Faker::Lorem.word }
7
+ from factory: :store
8
+ to factory: :fulfillment_center
9
+ status { 0 }
10
+ initiated_by factory: :user
11
+ sales_order
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :store_item, class: "Comee::Core::StoreItem" do
3
+ quantity { Faker::Number.between(from: 0, to: 20) }
4
+ reorder_threshold { Faker::Number.between(from: 0, to: 20) }
5
+ product
6
+ store
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :store, class: "Comee::Core::Store" do
3
+ code { Faker::Alphanumeric.alpha(number: 8) }
4
+ name { Faker::Name.name }
5
+ address { Faker::Address.street_address }
6
+ email { Faker::Internet.email }
7
+ warehouse_manager factory: :user
8
+ end
9
+ 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.2.96
4
+ version: 0.2.97
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henock L.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-15 00:00:00.000000000 Z
11
+ date: 2024-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -294,6 +294,7 @@ files:
294
294
  - app/controllers/comee/core/customs_details_controller.rb
295
295
  - app/controllers/comee/core/external_rfqs_controller.rb
296
296
  - app/controllers/comee/core/fulfillment_centers_controller.rb
297
+ - app/controllers/comee/core/goods_received_notes_controller.rb
297
298
  - app/controllers/comee/core/item_statuses_controller.rb
298
299
  - app/controllers/comee/core/lookups_controller.rb
299
300
  - app/controllers/comee/core/notifications_controller.rb
@@ -305,6 +306,10 @@ files:
305
306
  - app/controllers/comee/core/sales_order_items_controller.rb
306
307
  - app/controllers/comee/core/sales_orders_controller.rb
307
308
  - app/controllers/comee/core/shipment_items_controller.rb
309
+ - app/controllers/comee/core/stock_transfer_request_items_controller.rb
310
+ - app/controllers/comee/core/stock_transfer_requests_controller.rb
311
+ - app/controllers/comee/core/store_items_controller.rb
312
+ - app/controllers/comee/core/stores_controller.rb
308
313
  - app/controllers/comee/core/suppliers_controller.rb
309
314
  - app/controllers/comee/core/unit_conversions_controller.rb
310
315
  - app/controllers/comee/core/units_controller.rb
@@ -337,6 +342,9 @@ files:
337
342
  - app/models/comee/core/email_setting.rb
338
343
  - app/models/comee/core/external_rfq.rb
339
344
  - app/models/comee/core/fulfillment_center.rb
345
+ - app/models/comee/core/goods_issued_item.rb
346
+ - app/models/comee/core/goods_issued_note.rb
347
+ - app/models/comee/core/goods_received_note.rb
340
348
  - app/models/comee/core/inventory.rb
341
349
  - app/models/comee/core/invoice.rb
342
350
  - app/models/comee/core/invoice_item.rb
@@ -360,12 +368,19 @@ files:
360
368
  - app/models/comee/core/purchase_requisition_item.rb
361
369
  - app/models/comee/core/quotation_request.rb
362
370
  - app/models/comee/core/quotation_request_item.rb
371
+ - app/models/comee/core/received_item.rb
372
+ - app/models/comee/core/reorder_report.rb
373
+ - app/models/comee/core/reorder_report_item.rb
363
374
  - app/models/comee/core/role.rb
364
375
  - app/models/comee/core/sales_order.rb
365
376
  - app/models/comee/core/sales_order_item.rb
366
377
  - app/models/comee/core/shipment_instruction.rb
367
378
  - app/models/comee/core/shipment_instruction_item.rb
368
379
  - app/models/comee/core/shipment_item.rb
380
+ - app/models/comee/core/stock_transfer_request.rb
381
+ - app/models/comee/core/stock_transfer_request_item.rb
382
+ - app/models/comee/core/store.rb
383
+ - app/models/comee/core/store_item.rb
369
384
  - app/models/comee/core/supplier.rb
370
385
  - app/models/comee/core/supplier_invoice.rb
371
386
  - app/models/comee/core/supplier_payment.rb
@@ -389,6 +404,7 @@ files:
389
404
  - app/serializers/comee/core/customs_detail_serializer.rb
390
405
  - app/serializers/comee/core/external_rfq_serializer.rb
391
406
  - app/serializers/comee/core/fulfillment_center_serializer.rb
407
+ - app/serializers/comee/core/goods_received_note_serializer.rb
392
408
  - app/serializers/comee/core/item_status_serializer.rb
393
409
  - app/serializers/comee/core/lookup_serializer.rb
394
410
  - app/serializers/comee/core/master_price_serializer.rb
@@ -405,6 +421,10 @@ files:
405
421
  - app/serializers/comee/core/sales_order_serializer.rb
406
422
  - app/serializers/comee/core/shipment_instruction_item_serializer.rb
407
423
  - app/serializers/comee/core/shipment_item_serializer.rb
424
+ - app/serializers/comee/core/stock_transfer_request_item_serializer.rb
425
+ - app/serializers/comee/core/stock_transfer_request_serializer.rb
426
+ - app/serializers/comee/core/store_item_serializer.rb
427
+ - app/serializers/comee/core/store_serializer.rb
408
428
  - app/serializers/comee/core/supplier_serializer.rb
409
429
  - app/serializers/comee/core/unit_conversion_serializer.rb
410
430
  - app/serializers/comee/core/unit_serializer.rb
@@ -412,6 +432,7 @@ files:
412
432
  - app/serializers/comee/core/user_serializer.rb
413
433
  - app/services/comee/core/beo_service.rb
414
434
  - app/services/comee/core/customer_order_service.rb
435
+ - app/services/comee/core/goods_received_note_service.rb
415
436
  - app/services/comee/core/product_lookup_service.rb
416
437
  - app/services/comee/core/quotation_request_service.rb
417
438
  - app/services/comee/core/sales_order_service.rb
@@ -482,6 +503,16 @@ files:
482
503
  - db/migrate/20240328132454_create_comee_core_supplier_invoices.rb
483
504
  - db/migrate/20240328132713_create_comee_core_payment_orders.rb
484
505
  - db/migrate/20240328132921_create_comee_core_supplier_payments.rb
506
+ - db/migrate/20240401115953_create_comee_core_stores.rb
507
+ - db/migrate/20240401123233_create_comee_core_store_items.rb
508
+ - db/migrate/20240401124757_create_comee_core_stock_transfer_requests.rb
509
+ - db/migrate/20240401131549_create_comee_core_stock_transfer_request_items.rb
510
+ - db/migrate/20240401192505_create_comee_core_reorder_reports.rb
511
+ - db/migrate/20240401193503_create_comee_core_reorder_report_items.rb
512
+ - db/migrate/20240406120401_create_comee_core_goods_received_notes.rb
513
+ - db/migrate/20240406124821_create_comee_core_received_items.rb
514
+ - db/migrate/20240406142113_create_comee_core_goods_issued_notes.rb
515
+ - db/migrate/20240406162711_create_comee_core_goods_issued_items.rb
485
516
  - db/migrate/20240407083617_create_comee_core_email_settings.rb
486
517
  - db/migrate/20240503040722_create_comee_core_client_addresses.rb
487
518
  - lib/comee/core.rb
@@ -509,6 +540,9 @@ files:
509
540
  - spec/factories/comee/core/email_settings.rb
510
541
  - spec/factories/comee/core/external_rfqs.rb
511
542
  - spec/factories/comee/core/fulfillment_centers.rb
543
+ - spec/factories/comee/core/goods_issued_items.rb
544
+ - spec/factories/comee/core/goods_issued_notes.rb
545
+ - spec/factories/comee/core/goods_received_notes.rb
512
546
  - spec/factories/comee/core/inventories.rb
513
547
  - spec/factories/comee/core/invoice_items.rb
514
548
  - spec/factories/comee/core/invoices.rb
@@ -531,12 +565,19 @@ files:
531
565
  - spec/factories/comee/core/purchase_requisitions.rb
532
566
  - spec/factories/comee/core/quotation_request_items.rb
533
567
  - spec/factories/comee/core/quotation_requests.rb
568
+ - spec/factories/comee/core/received_items.rb
569
+ - spec/factories/comee/core/reorder_report_items.rb
570
+ - spec/factories/comee/core/reorder_reports.rb
534
571
  - spec/factories/comee/core/roles.rb
535
572
  - spec/factories/comee/core/sales_order_items.rb
536
573
  - spec/factories/comee/core/sales_orders.rb
537
574
  - spec/factories/comee/core/shipment_instruction_items.rb
538
575
  - spec/factories/comee/core/shipment_instructions.rb
539
576
  - spec/factories/comee/core/shipment_items.rb
577
+ - spec/factories/comee/core/stock_transfer_request_items.rb
578
+ - spec/factories/comee/core/stock_transfer_requests.rb
579
+ - spec/factories/comee/core/store_items.rb
580
+ - spec/factories/comee/core/stores.rb
540
581
  - spec/factories/comee/core/supplier_invoices.rb
541
582
  - spec/factories/comee/core/supplier_payments.rb
542
583
  - spec/factories/comee/core/suppliers.rb