comee_core 0.1.40 → 0.1.41
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 +4 -4
- data/app/controllers/comee/core/customer_order_items_controller.rb +34 -0
- data/app/controllers/comee/core/customer_orders_controller.rb +47 -0
- data/app/controllers/comee/core/external_rfqs_controller.rb +13 -0
- data/app/controllers/comee/core/products_controller.rb +2 -3
- data/app/controllers/comee/core/quotation_request_items_controller.rb +46 -0
- data/app/controllers/comee/core/quotation_requests_controller.rb +66 -0
- data/app/controllers/comee/core/sales_order_items_controller.rb +25 -0
- data/app/controllers/comee/core/sales_orders_controller.rb +45 -0
- data/app/models/comee/core/customer_order.rb +10 -1
- data/app/models/comee/core/customer_order_item.rb +8 -0
- data/app/models/comee/core/external_rfq.rb +8 -0
- data/app/models/comee/core/product.rb +6 -34
- data/app/models/comee/core/purchase_order.rb +14 -0
- data/app/models/comee/core/purchase_order_item.rb +20 -0
- data/app/models/comee/core/quotation_request.rb +25 -0
- data/app/models/comee/core/quotation_request_item.rb +15 -0
- data/app/models/comee/core/sales_order.rb +2 -2
- data/app/serializers/comee/core/customer_order_item_serializer.rb +10 -0
- data/app/serializers/comee/core/customer_order_serializer.rb +9 -0
- data/app/serializers/comee/core/external_rfq_serializer.rb +7 -0
- data/app/serializers/comee/core/product_serializer.rb +1 -2
- data/app/serializers/comee/core/quotation_request_item_serializer.rb +10 -0
- data/app/serializers/comee/core/quotation_request_serializer.rb +8 -0
- data/app/serializers/comee/core/sales_order_item_serializer.rb +10 -0
- data/app/serializers/comee/core/sales_order_serializer.rb +10 -0
- data/app/services/comee/core/customer_order_service.rb +80 -0
- data/app/services/comee/core/quotation_request_service.rb +69 -0
- data/app/services/comee/core/sales_order_service.rb +141 -0
- data/config/routes.rb +57 -3
- data/db/migrate/20230728014322_create_comee_core_products.rb +3 -11
- data/db/migrate/20230811102708_create_comee_core_customer_order_items.rb +1 -0
- data/db/migrate/20230812190652_create_comee_core_sales_orders.rb +4 -4
- data/db/migrate/20230812212844_create_comee_core_sales_order_items.rb +2 -1
- data/db/migrate/20231121094339_create_comee_core_quotation_requests.rb +15 -0
- data/db/migrate/20231121132709_create_comee_core_quotation_request_items.rb +27 -0
- data/db/migrate/20231122094424_create_comee_core_external_rfqs.rb +10 -0
- data/db/migrate/20231125122723_create_comee_core_purchase_orders.rb +15 -0
- data/db/migrate/20231126082907_create_comee_core_purchase_order_items.rb +20 -0
- data/lib/comee/core/version.rb +1 -1
- data/lib/comee_core.rb +1 -0
- data/spec/factories/comee/core/customer_order_items.rb +1 -0
- data/spec/factories/comee/core/external_rfqs.rb +6 -0
- data/spec/factories/comee/core/products.rb +5 -4
- data/spec/factories/comee/core/purchase_order_items.rb +9 -0
- data/spec/factories/comee/core/purchase_orders.rb +8 -0
- data/spec/factories/comee/core/quotation_request_items.rb +14 -0
- data/spec/factories/comee/core/quotation_requests.rb +7 -0
- data/spec/factories/comee/core/sales_order_items.rb +2 -1
- data/spec/factories/comee/core/sales_orders.rb +0 -1
- metadata +49 -7
- data/app/controllers/comee/core/product_types_controller.rb +0 -18
- data/app/models/comee/core/product_type.rb +0 -19
- data/db/migrate/20230728012836_create_comee_core_product_types.rb +0 -13
- data/spec/factories/comee/core/product_types.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5af8bf8f2c1f9cf058e249237279cb6ae6019d0189c549c8bd5c6f421d4774a
|
4
|
+
data.tar.gz: 711689393088d435d720d49497d9e52e5db34cf15e4889fd4a020deb180fa0ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce2b456011d92074efffb23b2a1ba2df3f6818bd8d487b888fa5c4a9353ae4cea90af41a7b4fb0e4567070b1583c1f4a11eb308bce465a01fd8666d05eb574b4
|
7
|
+
data.tar.gz: ba7e824700d03d946fa3a1e30d4d0189dd0ac0b96a792482d10c611c70823eb345dfd75d8114e3905ffe48435cb231ba140cccbc180f524f92498af8ac2b84f9
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class CustomerOrderItemsController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def cancel
|
7
|
+
CustomerOrderItem.where(id: params[:ids]).update_all(canceled: true)
|
8
|
+
render json: {success: true}
|
9
|
+
end
|
10
|
+
|
11
|
+
def filter
|
12
|
+
query = CustomerOrderItem.ransack(params[:q])
|
13
|
+
render json: {success: true, data: serialize(query.result.includes(:product))}
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
item = CustomerOrderItem.find(params[:id])
|
18
|
+
|
19
|
+
if item.customer_order.draft?
|
20
|
+
item.destroy
|
21
|
+
render json: {success: true}
|
22
|
+
else
|
23
|
+
render json: {success: false, error: "Customer order should be in draft state."}, status: :forbidden
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def model_params
|
30
|
+
params.require(:payload).permit(:quantity, :price, :delivery_date, :canceled, :product_id, :customer_order_id, :unit_id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class CustomerOrdersController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
before_action :set_service, only: %i[submit submit_for_confirmation accept cancel]
|
7
|
+
|
8
|
+
def submit
|
9
|
+
order = @service.submit(params[:id])
|
10
|
+
render json: {success: true, data: serialize(order)}
|
11
|
+
rescue StandardError => e
|
12
|
+
render json: {success: false, error: e.message}
|
13
|
+
end
|
14
|
+
|
15
|
+
def submit_for_confirmation
|
16
|
+
order = @service.submit_for_confirmation(params[:id])
|
17
|
+
render json: {success: true, data: serialize(order)}
|
18
|
+
rescue StandardError => e
|
19
|
+
render json: {success: false, error: e.message}
|
20
|
+
end
|
21
|
+
|
22
|
+
def accept
|
23
|
+
order = @service.accept(params[:id])
|
24
|
+
render json: {success: true, data: serialize(order)}
|
25
|
+
rescue StandardError => e
|
26
|
+
render json: {success: false, error: e.message}
|
27
|
+
end
|
28
|
+
|
29
|
+
def cancel
|
30
|
+
order = @service.cancel(params[:id])
|
31
|
+
render json: {success: true, data: serialize(order)}
|
32
|
+
rescue StandardError => e
|
33
|
+
render json: {success: false, error: e.message}
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def model_params
|
39
|
+
params.require(:payload).permit(:order_number, :order_date, :order_terms, :delivery_address, :invoice_address, :status, :client_id)
|
40
|
+
end
|
41
|
+
|
42
|
+
def set_service
|
43
|
+
@service = CustomerOrderService.new
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -5,8 +5,7 @@ module Comee
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
super do
|
8
|
-
products =
|
9
|
-
products = products.where(ancestry: nil) if params[:root_only].present?
|
8
|
+
products = Product.leafs
|
10
9
|
products.then(&paginate)
|
11
10
|
end
|
12
11
|
end
|
@@ -14,7 +13,7 @@ module Comee
|
|
14
13
|
private
|
15
14
|
|
16
15
|
def model_params
|
17
|
-
params.required(:payload).permit(:code, :name, :description, :
|
16
|
+
params.required(:payload).permit(:code, :name, :description, :parent_id)
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class QuotationRequestItemsController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def cancel
|
7
|
+
QuotationRequestItem.where(id: params[:ids]).update_all(canceled: true)
|
8
|
+
render json: {success: true}
|
9
|
+
end
|
10
|
+
|
11
|
+
def filter
|
12
|
+
query = QuotationRequestItem.ransack(params[:q])
|
13
|
+
render json: {success: true, data: serialize(query.result.includes(:product))}
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
item = QuotationRequestItem.find(params[:id])
|
18
|
+
rfq = item.quotation_request
|
19
|
+
if QuotationRequest.statuses[rfq.status] == QuotationRequest.statuses[:draft]
|
20
|
+
item.destroy
|
21
|
+
render json: {success: true}
|
22
|
+
else
|
23
|
+
render json: {success: false, error: "RFQ should be in draft state first."}, status: :forbidden
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def model_params
|
30
|
+
params.require(:payload)
|
31
|
+
.permit(
|
32
|
+
:price,
|
33
|
+
:quantity,
|
34
|
+
:discount,
|
35
|
+
:valid_from,
|
36
|
+
:valid_to,
|
37
|
+
:product_id,
|
38
|
+
:quotation_request_id,
|
39
|
+
:unit_id,
|
40
|
+
:expected_delivery_date,
|
41
|
+
:canceled
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class QuotationRequestsController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def index
|
7
|
+
super do
|
8
|
+
QuotationRequest.includes(:client).all
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def filter
|
13
|
+
query = QuotationRequest.ransack(params[:q])
|
14
|
+
render json: {success: true, data: serialize(query.result.includes(:client))}
|
15
|
+
end
|
16
|
+
|
17
|
+
def rfq_products_for_client
|
18
|
+
client_products = ClientPrice.includes(:product).where(client_id: params[:id]).map(&:product_id)
|
19
|
+
root = Product.roots.first
|
20
|
+
ids = root.indirect_ids - client_products
|
21
|
+
products = Product.where(id: ids)
|
22
|
+
render json: {success: true, data: serialize(products)}
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_request_with_items
|
26
|
+
service = QuotationRequestService.new
|
27
|
+
result = service.create_request_with_items(rfq_params.to_h)
|
28
|
+
render json: {success: true, data: serialize(result)}
|
29
|
+
end
|
30
|
+
|
31
|
+
def submit
|
32
|
+
service = QuotationRequestService.new
|
33
|
+
rfq = service.submit(params[:id])
|
34
|
+
render json: {success: true, data: serialize(rfq)}
|
35
|
+
rescue StandardError => e
|
36
|
+
render json: {success: false, error: e.message}
|
37
|
+
end
|
38
|
+
|
39
|
+
def submit_for_confirmation
|
40
|
+
service = QuotationRequestService.new
|
41
|
+
rfq = service.submit_for_confirmation(params[:id])
|
42
|
+
render json: {success: true, data: serialize(rfq)}
|
43
|
+
rescue StandardError => e
|
44
|
+
render json: {success: false, error: e.message}
|
45
|
+
end
|
46
|
+
|
47
|
+
def confirm
|
48
|
+
service = QuotationRequestService.new
|
49
|
+
rfq = service.confirm(params[:id])
|
50
|
+
render json: {success: true, data: serialize(rfq)}
|
51
|
+
rescue StandardError => e
|
52
|
+
render json: {success: false, error: e.message}
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def model_params
|
58
|
+
params.require(:payload).permit(:reference_no, :status, :client_id)
|
59
|
+
end
|
60
|
+
|
61
|
+
def rfq_params
|
62
|
+
params.require(:payload).permit(:client_id, items: %i[product_id unit_id quantity expected_delivery_date])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class SalesOrderItemsController < ApplicationController
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def index
|
7
|
+
super do
|
8
|
+
Comee::Core::SalesOrderItem.includes(:customer_order_item).where(sales_order_id: params[:id])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def destroy
|
13
|
+
Comee::Core::SalesOrderItem.destroy(params[:id])
|
14
|
+
render json: {success: true}
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def model_params
|
20
|
+
params.require(:payload).permit(:sales_order_id, :customer_order_item_id, :unit_id, :quantity, :quantity_delivered, :price,
|
21
|
+
:delivery_date, :eb_number)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class SalesOrdersController < ApplicationController
|
4
|
+
include Common
|
5
|
+
before_action :set_object, only: %i[show update confirm cancel]
|
6
|
+
|
7
|
+
def confirm
|
8
|
+
@obj.confirm
|
9
|
+
render json: {success: true, data: serialize(@obj.reload)}
|
10
|
+
rescue StandardError => e
|
11
|
+
render json: {success: false, error: e.message}
|
12
|
+
end
|
13
|
+
|
14
|
+
def cancel
|
15
|
+
@obj.cancel
|
16
|
+
render json: {success: true, data: serialize(@obj.reload)}
|
17
|
+
rescue StandardError => e
|
18
|
+
render json: {success: false, error: e.message}
|
19
|
+
end
|
20
|
+
|
21
|
+
def index
|
22
|
+
super do
|
23
|
+
Comee::Core::SalesOrder.includes(:sales_order_items).all
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def filter
|
28
|
+
@sales_order = Comee::Core::SalesOrder.ransack(params[:q]).result
|
29
|
+
render json: {success: true, data: serialize(@sales_order)}
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def model_params
|
35
|
+
params.require(:payload).permit(:order_number, :customer_order_id, :payment_penalty, :status,
|
36
|
+
:total_price, :amount_paid, :pallete_note, :handover_date, :remark)
|
37
|
+
end
|
38
|
+
|
39
|
+
def back_order_params
|
40
|
+
params.permit(payload: [:supplier_id, :order_number, :order_date, :delivery_date, :delivery_address, :invoice_address,
|
41
|
+
back_order_items: %i[product_id requested_quantity requested_price supplier_quantity delivery_date]])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -2,10 +2,19 @@ module Comee
|
|
2
2
|
module Core
|
3
3
|
class CustomerOrder < ApplicationRecord
|
4
4
|
belongs_to :client
|
5
|
+
has_many :customer_order_items
|
5
6
|
|
6
|
-
enum :status, {draft: 0, submitted: 1,
|
7
|
+
enum :status, {draft: 0, submitted: 1, awaiting_confirmation: 2, accepted: 3, canceled: 4}
|
7
8
|
|
8
9
|
validates :order_number, :order_date, :order_terms, :delivery_address, :invoice_address, :status, presence: true
|
10
|
+
|
11
|
+
def self.ransackable_attributes(_auth_object = nil)
|
12
|
+
%w[client_id delivery_address invoice_address order_number status]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.ransackable_associations(_auth_object = nil)
|
16
|
+
%w[client customer_order_items]
|
17
|
+
end
|
9
18
|
end
|
10
19
|
end
|
11
20
|
end
|
@@ -6,6 +6,14 @@ module Comee
|
|
6
6
|
belongs_to :unit
|
7
7
|
|
8
8
|
validates :quantity, :price, :delivery_date, presence: true
|
9
|
+
|
10
|
+
def self.ransackable_attributes(_auth_object = nil)
|
11
|
+
%w[customer_order_id product_id unit_id]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.ransackable_associations(_auth_object = nil)
|
15
|
+
%w[customer_order product unit]
|
16
|
+
end
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
@@ -1,46 +1,18 @@
|
|
1
1
|
module Comee
|
2
2
|
module Core
|
3
3
|
class Product < ApplicationRecord
|
4
|
-
belongs_to :product_type
|
5
|
-
belongs_to :unit
|
6
|
-
has_many :inventories
|
7
4
|
has_ancestry
|
5
|
+
after_save :update_parent, if: proc { |product| product.parent && product.parent.leaf? }
|
8
6
|
|
9
7
|
validates :code, presence: true, uniqueness: true
|
10
8
|
validates :name, presence: true
|
11
|
-
validate :metadata_must_be_based_on_metadata_schema, if: -> { product_type.present? }
|
12
9
|
|
13
|
-
|
14
|
-
delegate(:code, :name, to: :unit, prefix: true)
|
10
|
+
scope :leafs, -> { where(leaf: true) }
|
15
11
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
properties = metadata_schema["properties"]
|
21
|
-
fields = properties.keys
|
22
|
-
required = metadata_schema["required"]
|
23
|
-
diff = metadata.keys - fields
|
24
|
-
unless diff.empty?
|
25
|
-
errors.add(:metadata, "holds fields that are not allowed #{diff}.")
|
26
|
-
return
|
27
|
-
end
|
28
|
-
|
29
|
-
diff = required - metadata.keys
|
30
|
-
unless diff.empty?
|
31
|
-
errors.add(:metadata, "should contain the following required fields #{diff}.")
|
32
|
-
return
|
33
|
-
end
|
34
|
-
|
35
|
-
metadata.each do |k, v|
|
36
|
-
errors.add(:metadata, "contains invalid value for field #{k}.") if v.class.to_s.downcase != properties[k]["type"]
|
37
|
-
if properties[k].key?("min") && v < properties[k]["min"]
|
38
|
-
errors.add(:base, "The value of #{k} cannot be lower than #{properties[k]['min']}.")
|
39
|
-
end
|
40
|
-
if properties[k].key?("max") && v > properties[k]["max"]
|
41
|
-
errors.add(:base, "The value of #{k} cannot be higher than #{properties[k]['max']}.")
|
42
|
-
end
|
43
|
-
end
|
12
|
+
def update_parent
|
13
|
+
obj = parent
|
14
|
+
obj.leaf = false
|
15
|
+
obj.save!
|
44
16
|
end
|
45
17
|
end
|
46
18
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class PurchaseOrder < ApplicationRecord
|
4
|
+
belongs_to :supplier
|
5
|
+
validates :order_date, :delivery_address, presence: true
|
6
|
+
enum status: {
|
7
|
+
draft: 0,
|
8
|
+
pending_approval: 1,
|
9
|
+
approved: 2,
|
10
|
+
submitted_to_supplier: 3
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class PurchaseOrderItem < ApplicationRecord
|
4
|
+
belongs_to :purchase_order
|
5
|
+
belongs_to :sales_order_item
|
6
|
+
validates :status, :quantity, :delivery_date, presence: true
|
7
|
+
validate :sales_order_item_must_have_eb_number
|
8
|
+
enum status: {
|
9
|
+
active: 0,
|
10
|
+
canceled: 1
|
11
|
+
}
|
12
|
+
def sales_order_item_must_have_eb_number
|
13
|
+
return unless sales_order_item
|
14
|
+
return if sales_order_item.eb_number
|
15
|
+
|
16
|
+
errors.add(:sales_order_item, "must have an EB number.")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class QuotationRequest < ApplicationRecord
|
4
|
+
before_validation :set_reference_no, if: proc { |rfq| rfq.reference_no.nil? }
|
5
|
+
|
6
|
+
belongs_to :client
|
7
|
+
has_many :quotation_request_items
|
8
|
+
|
9
|
+
enum :status, {draft: 0, submitted: 1, awaiting_confirmation: 2, confirmed: 3}
|
10
|
+
|
11
|
+
validates :status, presence: true
|
12
|
+
|
13
|
+
def self.ransackable_attributes(_auth_object = nil)
|
14
|
+
%w[client_id reference_no status]
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def set_reference_no
|
20
|
+
stamp = DateTime.now.to_i
|
21
|
+
self.reference_no = "RFQ-#{client.code}-#{stamp}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class QuotationRequestItem < ApplicationRecord
|
4
|
+
belongs_to :product
|
5
|
+
belongs_to :quotation_request
|
6
|
+
belongs_to :unit
|
7
|
+
|
8
|
+
validates :quantity, :price, :discount, :expected_delivery_date, presence: true
|
9
|
+
|
10
|
+
def self.ransackable_attributes(_auth_object = nil)
|
11
|
+
%w[quotation_request_id product_id unit_id quantity price discount expected_delivery_date]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -6,10 +6,10 @@ module Comee
|
|
6
6
|
belongs_to :customer_order
|
7
7
|
has_many :sales_order_items
|
8
8
|
|
9
|
-
enum :status, {draft: 0,
|
9
|
+
enum :status, {draft: 0, validated: 1, authorized: 2, approved: 3, cancelled: 4, confirmed: 5, finalized: 6}
|
10
10
|
|
11
11
|
validates :order_number, presence: true, uniqueness: true
|
12
|
-
validates :status,
|
12
|
+
validates :status, presence: true
|
13
13
|
validates :payment_penalty,
|
14
14
|
presence: true,
|
15
15
|
numericality: {greater_than_or_equal_to: 0, less_than_or_equal_to: 100}
|
@@ -1,8 +1,7 @@
|
|
1
1
|
module Comee
|
2
2
|
module Core
|
3
3
|
class ProductSerializer < ActiveModel::Serializer
|
4
|
-
attributes :id, :code, :name, :description
|
5
|
-
:product_type_code, :product_type_name
|
4
|
+
attributes :id, :code, :name, :description
|
6
5
|
end
|
7
6
|
end
|
8
7
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class SalesOrderItemSerializer < ActiveModel::Serializer
|
4
|
+
attributes :id, :quantity, :quantity_delivered, :price, :delivery_date, :eb_number
|
5
|
+
belongs_to :sales_order
|
6
|
+
belongs_to :customer_order_item
|
7
|
+
belongs_to :unit
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class SalesOrderSerializer < ActiveModel::Serializer
|
4
|
+
attributes :id, :order_number, :payment_penalty, :status, :total_price,
|
5
|
+
:amount_paid, :pallete_note, :handover_date, :remark
|
6
|
+
belongs_to :customer_order
|
7
|
+
has_many :sales_order_items
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Comee
|
2
|
+
module Core
|
3
|
+
class CustomerOrderService
|
4
|
+
def submit(id)
|
5
|
+
order = CustomerOrder.find_by(id: id)
|
6
|
+
raise(StandardError, "Customer order with id `#{id}` not found.") unless order
|
7
|
+
|
8
|
+
unless CustomerOrder.statuses[order.status] == CustomerOrder.statuses[:draft]
|
9
|
+
raise(StandardError, "Customer order should be in draft state.")
|
10
|
+
end
|
11
|
+
|
12
|
+
raise(StandardError, "Customer order should have at least one item.") unless order.customer_order_items.count.positive?
|
13
|
+
|
14
|
+
order.update!(status: CustomerOrder.statuses[:submitted])
|
15
|
+
order
|
16
|
+
end
|
17
|
+
|
18
|
+
def submit_for_confirmation(id)
|
19
|
+
order = CustomerOrder.find_by(id: id)
|
20
|
+
raise(StandardError, "Customer order with id `#{id}` not found.") unless order
|
21
|
+
|
22
|
+
unless CustomerOrder.statuses[order.status] == CustomerOrder.statuses[:submitted]
|
23
|
+
raise(StandardError, "Customer order should be in submitted state.")
|
24
|
+
end
|
25
|
+
|
26
|
+
raise(StandardError, "Customer order does not have any items.") if order.customer_order_items.count.zero?
|
27
|
+
|
28
|
+
order.update!(status: CustomerOrder.statuses[:awaiting_confirmation])
|
29
|
+
order
|
30
|
+
end
|
31
|
+
|
32
|
+
def accept(id)
|
33
|
+
order = CustomerOrder.find_by(id: id)
|
34
|
+
raise(StandardError, "Customer order with id `#{id}` not found.") unless order
|
35
|
+
|
36
|
+
unless CustomerOrder.statuses[order.status] == CustomerOrder.statuses[:submitted]
|
37
|
+
raise(StandardError, "Customer order should be in submitted state.")
|
38
|
+
end
|
39
|
+
|
40
|
+
raise(StandardError, "Customer order does not have any items.") if order.customer_order_items.count.zero?
|
41
|
+
|
42
|
+
sales_order = nil
|
43
|
+
CustomerOrder.transaction do
|
44
|
+
sales_order = SalesOrder.create!(
|
45
|
+
order_number: order.order_number,
|
46
|
+
customer_order: order,
|
47
|
+
status: SalesOrder.statuses[:draft]
|
48
|
+
)
|
49
|
+
items = order.customer_order_items.each_with_object([]) do |item, res|
|
50
|
+
next if item.canceled?
|
51
|
+
|
52
|
+
res << {
|
53
|
+
sales_order_id: sales_order.id,
|
54
|
+
customer_order_item_id: item.id,
|
55
|
+
unit_id: item.unit_id,
|
56
|
+
quantity: item.quantity,
|
57
|
+
price: item.price,
|
58
|
+
delivery_date: item.delivery_date
|
59
|
+
}
|
60
|
+
end
|
61
|
+
SalesOrderItem.insert_all!(items)
|
62
|
+
order.update!(status: CustomerOrder.statuses[:accepted])
|
63
|
+
end
|
64
|
+
sales_order
|
65
|
+
end
|
66
|
+
|
67
|
+
def cancel(id)
|
68
|
+
order = CustomerOrder.find_by(id: id)
|
69
|
+
raise(StandardError, "Customer order with id `#{id}` not found.") unless order
|
70
|
+
|
71
|
+
if CustomerOrder.statuses[order.status] == CustomerOrder.statuses[:canceled]
|
72
|
+
raise(StandardError, "Customer order is already canceled.")
|
73
|
+
end
|
74
|
+
|
75
|
+
order.update!(status: CustomerOrder.statuses[:canceled])
|
76
|
+
order
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|