smerp-quotation-engine 0.1.0

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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +10 -0
  5. data/app/assets/config/smerp_quotation_engine_manifest.js +1 -0
  6. data/app/assets/stylesheets/smerp/quotation/engine/application.css +15 -0
  7. data/app/controllers/smerp/quotation/engine/application_controller.rb +9 -0
  8. data/app/controllers/smerp/quotation/engine/quotation_item_groups_controller.rb +70 -0
  9. data/app/controllers/smerp/quotation/engine/quotation_items_controller.rb +237 -0
  10. data/app/controllers/smerp/quotation/engine/quotation_product_categories_controller.rb +60 -0
  11. data/app/controllers/smerp/quotation/engine/quotation_products_controller.rb +60 -0
  12. data/app/controllers/smerp/quotation/engine/quotations_controller.rb +192 -0
  13. data/app/helpers/smerp/quotation/engine/application_helper.rb +29 -0
  14. data/app/helpers/smerp/quotation/engine/quotation_item_groups_helper.rb +4 -0
  15. data/app/helpers/smerp/quotation/engine/quotation_items_helper.rb +4 -0
  16. data/app/helpers/smerp/quotation/engine/quotation_product_categories_helper.rb +4 -0
  17. data/app/helpers/smerp/quotation/engine/quotation_products_helper.rb +4 -0
  18. data/app/helpers/smerp/quotation/engine/quotations_helper.rb +81 -0
  19. data/app/jobs/smerp/quotation/engine/application_job.rb +8 -0
  20. data/app/mailers/smerp/quotation/engine/application_mailer.rb +10 -0
  21. data/app/models/smerp/quotation/engine/application_record.rb +9 -0
  22. data/app/models/smerp/quotation/engine/quotation.rb +11 -0
  23. data/app/models/smerp/quotation/engine/quotation_item.rb +34 -0
  24. data/app/models/smerp/quotation/engine/quotation_item_group.rb +10 -0
  25. data/app/models/smerp/quotation/engine/quotation_product.rb +30 -0
  26. data/app/models/smerp/quotation/engine/quotation_product_category.rb +11 -0
  27. data/app/views/layouts/smerp/quotation/engine/application.html.erb +15 -0
  28. data/app/views/smerp/quotation/engine/_new_quotation_item_form.html.erb +48 -0
  29. data/app/views/smerp/quotation/engine/extended_calculators/extended_calculators.html.erb +36 -0
  30. data/app/views/smerp/quotation/engine/quotation_item_groups/_form.html.erb +17 -0
  31. data/app/views/smerp/quotation/engine/quotation_item_groups/_quotation_item_group.html.erb +2 -0
  32. data/app/views/smerp/quotation/engine/quotation_item_groups/edit.html.erb +10 -0
  33. data/app/views/smerp/quotation/engine/quotation_item_groups/index.html.erb +14 -0
  34. data/app/views/smerp/quotation/engine/quotation_item_groups/new.html.erb +9 -0
  35. data/app/views/smerp/quotation/engine/quotation_item_groups/show.html.erb +10 -0
  36. data/app/views/smerp/quotation/engine/quotation_items/_form.html.erb +53 -0
  37. data/app/views/smerp/quotation/engine/quotation_items/_product_item_form.html.erb +47 -0
  38. data/app/views/smerp/quotation/engine/quotation_items/_quotation_item.html.erb +17 -0
  39. data/app/views/smerp/quotation/engine/quotation_items/edit.html.erb +9 -0
  40. data/app/views/smerp/quotation/engine/quotation_items/index.html.erb +14 -0
  41. data/app/views/smerp/quotation/engine/quotation_items/new.html.erb +9 -0
  42. data/app/views/smerp/quotation/engine/quotation_items/new_product_item.html.erb +7 -0
  43. data/app/views/smerp/quotation/engine/quotation_items/show.html.erb +76 -0
  44. data/app/views/smerp/quotation/engine/quotation_product_categories/_form.html.erb +33 -0
  45. data/app/views/smerp/quotation/engine/quotation_product_categories/_quotation_product_category.html.erb +17 -0
  46. data/app/views/smerp/quotation/engine/quotation_product_categories/edit.html.erb +10 -0
  47. data/app/views/smerp/quotation/engine/quotation_product_categories/index.html.erb +14 -0
  48. data/app/views/smerp/quotation/engine/quotation_product_categories/new.html.erb +9 -0
  49. data/app/views/smerp/quotation/engine/quotation_product_categories/show.html.erb +10 -0
  50. data/app/views/smerp/quotation/engine/quotation_products/_form.html.erb +41 -0
  51. data/app/views/smerp/quotation/engine/quotation_products/_quotation_product.html.erb +9 -0
  52. data/app/views/smerp/quotation/engine/quotation_products/edit.html.erb +10 -0
  53. data/app/views/smerp/quotation/engine/quotation_products/index.html.erb +19 -0
  54. data/app/views/smerp/quotation/engine/quotation_products/new.html.erb +9 -0
  55. data/app/views/smerp/quotation/engine/quotation_products/show.html.erb +32 -0
  56. data/app/views/smerp/quotation/engine/quotations/_form.html.erb +49 -0
  57. data/app/views/smerp/quotation/engine/quotations/_new_group_form.html.erb +24 -0
  58. data/app/views/smerp/quotation/engine/quotations/_product_item_form.html.erb +47 -0
  59. data/app/views/smerp/quotation/engine/quotations/_quotation.html.erb +10 -0
  60. data/app/views/smerp/quotation/engine/quotations/_quotation_item.html.erb +96 -0
  61. data/app/views/smerp/quotation/engine/quotations/edit.html.erb +9 -0
  62. data/app/views/smerp/quotation/engine/quotations/extended_calculators.html.erb +36 -0
  63. data/app/views/smerp/quotation/engine/quotations/index.html.erb +21 -0
  64. data/app/views/smerp/quotation/engine/quotations/new.html.erb +9 -0
  65. data/app/views/smerp/quotation/engine/quotations/new_extended_calculator.html.erb +65 -0
  66. data/app/views/smerp/quotation/engine/quotations/new_product_item.html.erb +7 -0
  67. data/app/views/smerp/quotation/engine/quotations/show.html.erb +151 -0
  68. data/config/routes.rb +50 -0
  69. data/db/migrate/20220929020407_create_smerp_quotation_engine_quotation_products.rb +16 -0
  70. data/db/migrate/20220929041715_create_smerp_quotation_engine_quotation_product_categories.rb +12 -0
  71. data/db/migrate/20220929074438_link_product_to_item.rb +5 -0
  72. data/db/seeds.rb +36 -0
  73. data/lib/smerp/quotation/engine/engine.rb +40 -0
  74. data/lib/smerp/quotation/engine/version.rb +7 -0
  75. data/lib/smerp/quotation/engine.rb +10 -0
  76. data/lib/tasks/smerp/quotation/engine_tasks.rake +4 -0
  77. metadata +216 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d68cf8a3a09b4bb085a2d0e89da3fc9419fc4c94d7df7f3631265f1015b2131f
4
+ data.tar.gz: 2f087046539ac9af424f26e1cdd0348276846da5ce3e344a988be5e2fad5a62c
5
+ SHA512:
6
+ metadata.gz: 14f91b006501d88f4486798f0041a8081479fe937e3125e6953a2db9ffe4c87e0730206309555cd77d19663fe327ed05132998f874c29693aa7f322600aff72a
7
+ data.tar.gz: '038b254cdacb62dbefba42717a5f1150fee5a299e8c932b9f836e7f40a99e3c5d0ee971215389fd6f843de4cb475358c0f7f979ca053d66a367f57fae6cae7ef'
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 Ian
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # Smerp::Quotation::Engine
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem "smerp-quotation-engine"
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install smerp-quotation-engine
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require 'devops_assist'
9
+
10
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/smerp/quotation/engine .css
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,9 @@
1
+ module Smerp
2
+ module Quotation
3
+ module Engine
4
+ class ApplicationController < ActionController::Base
5
+ layout "application"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,70 @@
1
+ module Smerp::Quotation::Engine
2
+ class QuotationItemGroupsController < ApplicationController
3
+ before_action :find_quotation
4
+ before_action :set_quotation_item_group, only: %i[ show edit update destroy ]
5
+
6
+ def find_quotation
7
+ if params[:quotation_item_group].nil?
8
+ @quotation = Quotation.find(params[:quotation_id])
9
+ else
10
+ @quotation = Quotation.find(params[:quotation_item_group][:quotation_id])
11
+ end
12
+ end
13
+
14
+ # GET /quotation_item_groups
15
+ def index
16
+ @quotation_item_groups = QuotationItemGroup.all
17
+ end
18
+
19
+ # GET /quotation_item_groups/1
20
+ def show
21
+ end
22
+
23
+ # GET /quotation_item_groups/new
24
+ def new
25
+ @quotation_item_group = QuotationItemGroup.new
26
+ end
27
+
28
+ # GET /quotation_item_groups/1/edit
29
+ def edit
30
+ end
31
+
32
+ # POST /quotation_item_groups
33
+ def create
34
+ @quotation_item_group = QuotationItemGroup.new(quotation_item_group_params)
35
+
36
+ if @quotation_item_group.save
37
+ redirect_to @quotation, notice: "Quotation item group was successfully created."
38
+ else
39
+ render :new, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # PATCH/PUT /quotation_item_groups/1
44
+ def update
45
+ if @quotation_item_group.update(quotation_item_group_params)
46
+ redirect_to @quotation, notice: "Quotation item group was successfully updated."
47
+ else
48
+ render :edit, status: :unprocessable_entity
49
+ end
50
+ end
51
+
52
+ # DELETE /quotation_item_groups/1
53
+ def destroy
54
+ @quotation_item_group.destroy
55
+ redirect_to @quotation, notice: "Quotation item group was successfully destroyed."
56
+ end
57
+
58
+ private
59
+ # Use callbacks to share common setup or constraints between actions.
60
+ def set_quotation_item_group
61
+ @quotation_item_group = QuotationItemGroup.find(params[:id])
62
+ end
63
+
64
+ # Only allow a list of trusted parameters through.
65
+ def quotation_item_group_params
66
+ #params.fetch(:quotation_item_group, {})
67
+ params.require(:quotation_item_group).permit(:quotation_id, :name)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,237 @@
1
+ module Smerp::Quotation::Engine
2
+ class QuotationItemsController < ApplicationController
3
+
4
+ include TR::CondUtils
5
+
6
+ before_action :find_parent
7
+ before_action :set_quotation_item, only: %i[ show edit update destroy apply_discount remove_tax add_sub_item apply_tax hide_children show_children new_product_item ]
8
+
9
+ def find_parent
10
+ if params[:quotation_item].nil?
11
+ qid = params[:quotation_id]
12
+ gid = params[:quotation_item_group_id]
13
+ else
14
+ qid = params[:quotation_item][:quotation_id]
15
+ gid = params[:quotation_item][:quotation_item_group_id]
16
+ end
17
+
18
+ if not_empty?(qid)
19
+ @quotation = Quotation.find(qid)
20
+ elsif not_empty?(gid)
21
+ @group = QuotationItemGroup.find(gid)
22
+ @quotation = @group.quotation
23
+ else
24
+ # use sprangly as the route allow direct access without parent
25
+ end
26
+
27
+ end
28
+
29
+ # GET /quotation_items
30
+ def index
31
+ @quotation_items = QuotationItem.all
32
+ end
33
+
34
+ # GET /quotation_items/1
35
+ def show
36
+ end
37
+
38
+ # GET /quotation_items/new
39
+ def new
40
+ @quotation_item = QuotationItem.new
41
+ end
42
+
43
+ # GET /quotation_items/1/edit
44
+ def edit
45
+ end
46
+
47
+ # POST /quotation_items
48
+ def create
49
+ @quotation_item = QuotationItem.new(quotation_item_params)
50
+
51
+ if @quotation_item.save
52
+ redirect_to @quotation, notice: "Quotation item was successfully created."
53
+ else
54
+ render :new, status: :unprocessable_entity
55
+ end
56
+ end
57
+
58
+ # PATCH/PUT /quotation_items/1
59
+ def update
60
+ if @quotation_item.update(quotation_item_params)
61
+ redirect_to @quotation, notice: "Quotation item was successfully updated."
62
+ else
63
+ render :edit, status: :unprocessable_entity
64
+ end
65
+ end
66
+
67
+ # DELETE /quotation_items/1
68
+ def destroy
69
+ q = @quotation_item.quotation.clone
70
+ @quotation_item.destroy
71
+
72
+ redirect_to quotation_url(q), notice: "Quotation item was successfully destroyed."
73
+ end
74
+
75
+ def apply_discount
76
+ val = params[:quotation_item][:discount]
77
+ target = params[:quotation_item][:discount_on]
78
+ ecid = params[:quotation_item][:ecid]
79
+
80
+ if not @quotation_item.attributes.keys.include?(target)
81
+ raise "Discount target '#{target}' not a valid field"
82
+ end
83
+
84
+ indx = val =~ /p/
85
+ if not indx.nil?
86
+ vv = val[0...indx]
87
+ vf = vv.to_f
88
+
89
+ if not_empty?(ecid)
90
+ @quotation_item.update_ext_cal(ecid, params: vf.percent)
91
+ else
92
+ cal = Smerp::Quotation::ExtendedCalculator.instance(:discount, vf.percent)
93
+ cal.input_field = target
94
+ cal.output_field = [{ discount: Smerp::Quotation::DiscountCalculator::DiscountedAmount }, { line_total_after_discount: Smerp::Quotation::DiscountCalculator::ValueAfterDiscount }]
95
+ @quotation_item.add_ext_cal(cal)
96
+ end
97
+
98
+ if @quotation_item.save
99
+ redirect_to quotation_url(@quotation_item.quotation), notice: "Discount applied"
100
+ else
101
+ redirect_to quotation_url(@quotation_item.quotation), error: "Quotation item update field. Error was : #{@quotation_item.errors}"
102
+ end
103
+
104
+ else
105
+ vf = val.to_f
106
+
107
+ if not_empty?(ecid)
108
+ @quotation_item.update_ext_cal(ecid, params: vf)
109
+ else
110
+ cal = Smerp::Quotation::ExtendedCalculator.instance(:discount, vf)
111
+ cal.input_field = target
112
+ cal.output_field = [{ discount: Smerp::Quotation::DiscountCalculator::DiscountedAmount }, { line_total_after_discount: Smerp::Quotation::DiscountCalculator::ValueAfterDiscount }]
113
+ @quotation_item.add_ext_cal(cal)
114
+ end
115
+
116
+ if @quotation_item.save
117
+ redirect_to quotation_url(@quotation_item.quotation), notice: "Discount applied"
118
+ else
119
+ redirect_to quotation_url(@quotation_item.quotation), error: "Quotation item update field. Error was : #{@quotation_item.errors}"
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+
126
+ def apply_tax
127
+ val = params[:quotation_item][:tax]
128
+ ecid = params[:quotation_item][:ecid]
129
+
130
+ indx = val =~ /p/
131
+ if not indx.nil?
132
+ vv = val[0...indx]
133
+ vf = vv.to_f
134
+
135
+ if not_empty?(ecid)
136
+ @quotation_item.update_ext_cal(ecid, params: vf.percent)
137
+ else
138
+ cal = Smerp::Quotation::ExtendedCalculator.instance(:tax, vf.percent)
139
+ cal.input_field = :line_total_after_discount
140
+ cal.output_field = [{ tax: Smerp::Quotation::TaxCalculator::TaxAmount }, { line_total_with_tax: Smerp::Quotation::TaxCalculator::ValueWithTax }]
141
+ @quotation_item.add_ext_cal(cal)
142
+ end
143
+
144
+ if @quotation_item.save
145
+ redirect_to quotation_url(@quotation_item.quotation), notice: "Tax applied"
146
+ else
147
+ redirect_to quotation_url(@quotation_item.quotation), error: "Quotation item update field. Error was : #{@quotation_item.errors}"
148
+ end
149
+
150
+ else
151
+ vf = val.to_f
152
+
153
+ if not_empty?(ecid)
154
+ @quotation_item.update_ext_cal(ecid, params: vf)
155
+ else
156
+ cal = Smerp::Quotation::ExtendedCalculator.instance(:tax, vf)
157
+ cal.input_field = target
158
+ cal.output_field = [{ tax: Smerp::Quotation::TaxCalculator::TaxAmount }, { line_total_with_tax: Smerp::Quotation::TaxCalculator::ValueWithTax }]
159
+ @quotation_item.add_ext_cal(cal)
160
+ end
161
+
162
+ if @quotation_item.save
163
+ redirect_to quotation_url(@quotation_item.quotation), notice: "Tax applied"
164
+ else
165
+ redirect_to quotation_url(@quotation_item.quotation), error: "Quotation item update field. Error was : #{@quotation_item.errors}"
166
+ end
167
+
168
+ end
169
+
170
+ end
171
+
172
+ def remove_tax
173
+ if not_empty?(@quotation_item.extended_calculators)
174
+ cal = YAML.load(@quotation_item.extended_calculators)
175
+ # cannot directly remove as there is current tax value calculated before
176
+ # If remove means the previous value will not get updated.
177
+ # Provbably later device a mechanism to remove after update
178
+ cal[:local].each do |c|
179
+ c.params = 0.percent if c.is_a?(Smerp::Quotation::TaxCalculator)
180
+ end
181
+ cal[:quotation].each do |c|
182
+ c.params = 0.percent if c.is_a?(Smerp::Quotation::TaxCalculator)
183
+ end
184
+ @quotation_item.extended_calculators = YAML.dump(cal)
185
+ @quotation_item.save
186
+ end
187
+
188
+ redirect_to quotation_url(@quotation_item.quotation), notice: "Tax removed for '#{@quotation_item.name}'"
189
+ end
190
+
191
+ def add_sub_item
192
+ @parent = @quotation_item
193
+ @quotation = @parent.quotation
194
+
195
+ @quotation_item = QuotationItem.new
196
+ @quotation_item.parent = @parent
197
+ @quotation_item.quotation = @quotation
198
+
199
+ render "new", quotation_item: @quotation_item, quotation: @quotation
200
+ end
201
+
202
+ def hide_children
203
+ session[:hide_children_parent_id] = [] if session[:hide_children_parent_id].nil?
204
+ session[:hide_children_parent_id] << @quotation_item.id
205
+ session[:hide_children_parent_id].uniq!
206
+
207
+ redirect_to quotation_url(@quotation_item.quotation)
208
+ end
209
+
210
+ def show_children
211
+ if not session[:hide_children_parent_id].nil?
212
+ session[:hide_children_parent_id].delete_if { |i| i == @quotation_item.id }
213
+ end
214
+
215
+ redirect_to quotation_url(@quotation_item.quotation)
216
+ end
217
+
218
+ def new_product_item
219
+ @parent = @quotation_item
220
+ @quotation = @quotation_item.quotation
221
+
222
+ @quotation_item = QuotationItem.new
223
+ end
224
+
225
+ private
226
+ # Use callbacks to share common setup or constraints between actions.
227
+ def set_quotation_item
228
+ @quotation_item = QuotationItem.find(params[:id])
229
+ end
230
+
231
+ # Only allow a list of trusted parameters through.
232
+ def quotation_item_params
233
+ #params.fetch(:quotation_item, {})
234
+ params.require(:quotation_item).permit(:quotation_id, :name, :quantity, :unit, :unit_price, :discount, :discount_unit, :tax, :tax_unit, :quotation_item_group_id, :ecid, :parent_id, :quotation_product_id )
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,60 @@
1
+ module Smerp::Quotation::Engine
2
+ class QuotationProductCategoriesController < ApplicationController
3
+ before_action :set_quotation_product_category, only: %i[ show edit update destroy ]
4
+
5
+ # GET /quotation_product_categories
6
+ def index
7
+ @quotation_product_categories = QuotationProductCategory.all
8
+ end
9
+
10
+ # GET /quotation_product_categories/1
11
+ def show
12
+ end
13
+
14
+ # GET /quotation_product_categories/new
15
+ def new
16
+ @quotation_product_category = QuotationProductCategory.new
17
+ end
18
+
19
+ # GET /quotation_product_categories/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /quotation_product_categories
24
+ def create
25
+ @quotation_product_category = QuotationProductCategory.new(quotation_product_category_params)
26
+
27
+ if @quotation_product_category.save
28
+ redirect_to @quotation_product_category, notice: "Quotation product category was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /quotation_product_categories/1
35
+ def update
36
+ if @quotation_product_category.update(quotation_product_category_params)
37
+ redirect_to @quotation_product_category, notice: "Quotation product category was successfully updated."
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /quotation_product_categories/1
44
+ def destroy
45
+ @quotation_product_category.destroy
46
+ redirect_to quotation_product_categories_url, notice: "Quotation product category was successfully destroyed."
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_quotation_product_category
52
+ @quotation_product_category = QuotationProductCategory.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def quotation_product_category_params
57
+ params.require(:quotation_product_category).permit(:name, :notes, :state)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ module Smerp::Quotation::Engine
2
+ class QuotationProductsController < ApplicationController
3
+ before_action :set_quotation_product, only: %i[ show edit update destroy ]
4
+
5
+ # GET /quotation_products
6
+ def index
7
+ @quotation_products = QuotationProduct.all
8
+ end
9
+
10
+ # GET /quotation_products/1
11
+ def show
12
+ end
13
+
14
+ # GET /quotation_products/new
15
+ def new
16
+ @quotation_product = QuotationProduct.new
17
+ end
18
+
19
+ # GET /quotation_products/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /quotation_products
24
+ def create
25
+ @quotation_product = QuotationProduct.new(quotation_product_params)
26
+
27
+ if @quotation_product.save
28
+ redirect_to @quotation_product, notice: "Quotation product was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /quotation_products/1
35
+ def update
36
+ if @quotation_product.update(quotation_product_params)
37
+ redirect_to @quotation_product, notice: "Quotation product was successfully updated."
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /quotation_products/1
44
+ def destroy
45
+ @quotation_product.destroy
46
+ redirect_to quotation_products_url, notice: "Quotation product was successfully destroyed."
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_quotation_product
52
+ @quotation_product = QuotationProduct.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def quotation_product_params
57
+ params.require(:quotation_product).permit(:name, :notes, :quotation_product_category_id, :state, :unit, :unit_price)
58
+ end
59
+ end
60
+ end