smerp-quotation-engine 0.1.5 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/smerp/quotation/engine/quotation_item_distributions_controller.rb +95 -0
- data/app/controllers/smerp/quotation/engine/quotation_items_controller.rb +7 -2
- data/app/helpers/smerp/quotation/engine/quotation_item_distributions_helper.rb +14 -0
- data/app/helpers/smerp/quotation/engine/quotation_items_helper.rb +28 -0
- data/app/helpers/smerp/quotation/engine/quotations_helper.rb +12 -12
- data/app/models/smerp/quotation/engine/quotation_item.rb +2 -0
- data/app/models/smerp/quotation/engine/quotation_item_distribution.rb +6 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/_form.html.erb +71 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/_quotation_item.html.erb +29 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/_quotation_item_distribution.html.erb +2 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/edit.html.erb +10 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/index.html.erb +14 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/new.html.erb +9 -0
- data/app/views/smerp/quotation/engine/quotation_item_distributions/show.html.erb +10 -0
- data/app/views/smerp/quotation/engine/quotation_items/_quotation_item.html.erb +28 -11
- data/app/views/smerp/quotation/engine/quotation_items/distribute.html.erb +47 -0
- data/app/views/smerp/quotation/engine/quotations/_quotation_item.html.erb +80 -7
- data/app/views/smerp/quotation/engine/quotations/show.html.erb +3 -0
- data/config/routes.rb +6 -0
- data/lib/smerp/quotation/engine/version.rb +1 -1
- metadata +33 -23
- data/app/views/smerp/quotation/engine/_new_quotation_item_form.html.erb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c5fb38d83a4caac8b3251dc2aebcecf5aea0d255dea1719df5ed2fccf0a846a
|
4
|
+
data.tar.gz: ebbf3ffbe92b9ef197ebf223c36e04a5c78d7132ae793c8b9884b837199f8b02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89ee2cd9161ff3123e06a71e16131cc05f6413e8491458557a7f2d3c6144159514b4228736dd2ffd0dd35fe61ae5909a0b94a18b330811bbb4928de99051d384
|
7
|
+
data.tar.gz: 2c93dbb0d79aeda5773c25847eb5637d93beb41b0642331fc4cd00d5cdefbe66ff3436f843666d48e95a7b8985cedd7bd40cc6aeb8d39b6fe31ba53b9b9ebce8
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Smerp::Quotation::Engine
|
2
|
+
class QuotationItemDistributionsController < ApplicationController
|
3
|
+
|
4
|
+
before_action :set_quotation_item
|
5
|
+
before_action :set_quotation_item_distribution, only: %i[ show edit update destroy ]
|
6
|
+
|
7
|
+
def set_quotation_item
|
8
|
+
#@quotation_item = QuotationItem.find(params[:id])
|
9
|
+
#@quotation = @quotation_item.quotation
|
10
|
+
end
|
11
|
+
|
12
|
+
# GET /quotation_item_distributions
|
13
|
+
def index
|
14
|
+
@quotation_item_distributions = QuotationItemDistribution.all
|
15
|
+
end
|
16
|
+
|
17
|
+
# GET /quotation_item_distributions/1
|
18
|
+
def show
|
19
|
+
end
|
20
|
+
|
21
|
+
# GET /quotation_item_distributions/new
|
22
|
+
def new
|
23
|
+
@quotation_item = QuotationItem.find(params[:source_quotation_item])
|
24
|
+
@quotation = @quotation_item.quotation
|
25
|
+
@quotation_item_distribution = QuotationItemDistribution.new
|
26
|
+
end
|
27
|
+
|
28
|
+
# GET /quotation_item_distributions/1/edit
|
29
|
+
def edit
|
30
|
+
end
|
31
|
+
|
32
|
+
# POST /quotation_item_distributions
|
33
|
+
def create
|
34
|
+
#@quotation_item_distribution = QuotationItemDistribution.new(quotation_item_distribution_params)
|
35
|
+
|
36
|
+
qi = QuotationItem.find(params[:quotation_item_distribution][:quotation_item_id])
|
37
|
+
|
38
|
+
if not params[:quotation_item_distribution].nil? and not params[:quotation_item_distribution][:quantum].nil?
|
39
|
+
params[:quotation_item_distribution][:quantum].each do |k,v|
|
40
|
+
|
41
|
+
vv = v.first
|
42
|
+
indx = vv =~ /p/
|
43
|
+
if indx.nil?
|
44
|
+
val = vv.to_f
|
45
|
+
next if val == 0
|
46
|
+
else
|
47
|
+
val = vv[0...indx].to_f.percent
|
48
|
+
next if val.rep_value == 0
|
49
|
+
end
|
50
|
+
|
51
|
+
dest = QuotationItem.find(k)
|
52
|
+
qi.distribute_to(dest, val)
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
redirect_to quotation_path(qi.quotation), notice: "Distribution saved"
|
58
|
+
|
59
|
+
#if @quotation_item_distribution.save
|
60
|
+
# redirect_to @quotation_item_distribution, notice: "Quotation item distribution was successfully created."
|
61
|
+
#else
|
62
|
+
# render :new, status: :unprocessable_entity
|
63
|
+
#end
|
64
|
+
end
|
65
|
+
|
66
|
+
# PATCH/PUT /quotation_item_distributions/1
|
67
|
+
def update
|
68
|
+
if @quotation_item_distribution.update(quotation_item_distribution_params)
|
69
|
+
redirect_to @quotation_item_distribution, notice: "Quotation item distribution was successfully updated."
|
70
|
+
else
|
71
|
+
render :edit, status: :unprocessable_entity
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# DELETE /quotation_item_distributions/1
|
76
|
+
def destroy
|
77
|
+
@quotation_item = @quotation_item_distribution.quotation_item
|
78
|
+
@quotation_item_distribution.destroy
|
79
|
+
#redirect_to quotation_item_distributions_url, notice: "Quotation item distribution was successfully destroyed."
|
80
|
+
redirect_to quotation_path(@quotation_item.quotation), notice: "Quotation item distribution was successfully destroyed."
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
# Use callbacks to share common setup or constraints between actions.
|
85
|
+
def set_quotation_item_distribution
|
86
|
+
@quotation_item_distribution = QuotationItemDistribution.find(params[:id])
|
87
|
+
end
|
88
|
+
|
89
|
+
# Only allow a list of trusted parameters through.
|
90
|
+
def quotation_item_distribution_params
|
91
|
+
params.fetch(:quotation_item_distribution, {})
|
92
|
+
#params.require(:quotation_item_distribution).permit()
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -4,7 +4,7 @@ module Smerp::Quotation::Engine
|
|
4
4
|
include TR::CondUtils
|
5
5
|
|
6
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 ]
|
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 distribute ]
|
8
8
|
|
9
9
|
def find_parent
|
10
10
|
if params[:quotation_item].nil?
|
@@ -66,7 +66,7 @@ module Smerp::Quotation::Engine
|
|
66
66
|
|
67
67
|
# DELETE /quotation_items/1
|
68
68
|
def destroy
|
69
|
-
q = @quotation_item.quotation
|
69
|
+
q = @quotation_item.quotation
|
70
70
|
@quotation_item.destroy
|
71
71
|
|
72
72
|
redirect_to quotation_url(q), notice: "Quotation item was successfully destroyed."
|
@@ -222,6 +222,11 @@ module Smerp::Quotation::Engine
|
|
222
222
|
@quotation_item = QuotationItem.new
|
223
223
|
end
|
224
224
|
|
225
|
+
def distribute
|
226
|
+
@quotation = @quotation_item.quotation
|
227
|
+
#redirect_to quotation_url(@quotation_item.quotation)
|
228
|
+
end
|
229
|
+
|
225
230
|
private
|
226
231
|
# Use callbacks to share common setup or constraints between actions.
|
227
232
|
def set_quotation_item
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Smerp::Quotation::Engine
|
2
|
+
module QuotationItemDistributionsHelper
|
3
|
+
|
4
|
+
def distribution_params(paramVal)
|
5
|
+
case paramVal
|
6
|
+
when Smerp::Common::FinUtils::Percent
|
7
|
+
"#{paramVal.value}%"
|
8
|
+
else
|
9
|
+
"#{currency(paramVal)}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -1,4 +1,32 @@
|
|
1
1
|
module Smerp::Quotation::Engine
|
2
2
|
module QuotationItemsHelper
|
3
|
+
|
4
|
+
def render_item_tree_table(itm, level = 1, indx = 0)
|
5
|
+
cont = []
|
6
|
+
level += 1
|
7
|
+
indx = 0
|
8
|
+
if session[:hide_children_parent_id].nil? or not session[:hide_children_parent_id].include?(itm.id)
|
9
|
+
itm.children.each do |c|
|
10
|
+
cont << render("quotation_item", quotation_item: c, level: level, index: indx)
|
11
|
+
indx += 1
|
12
|
+
cont += render_item_tree_table(c, level, indx)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
cont
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def level_marker(level)
|
20
|
+
marker = [
|
21
|
+
"#DBFED8", #light green
|
22
|
+
"#FEF0D8",
|
23
|
+
"#D8F8FE",
|
24
|
+
"#FED8D8"
|
25
|
+
]
|
26
|
+
|
27
|
+
marker[level%4]
|
28
|
+
end
|
29
|
+
|
30
|
+
|
3
31
|
end
|
4
32
|
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
module Smerp::Quotation::Engine
|
2
2
|
module QuotationsHelper
|
3
3
|
|
4
|
-
def render_item_tree(itm)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
#def render_item_tree(itm)
|
5
|
+
# cont = []
|
6
|
+
# cont << "<ol type=\"i\">"
|
7
|
+
# itm.children.each do |c|
|
8
|
+
# cont << "<div id=\"quotation_items\">"
|
9
|
+
# cont << render("quotation_item", quotation_item: c)
|
10
|
+
# cont << "</div>"
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
12
|
+
# cont += render_item_tree(c)
|
13
|
+
# end
|
14
|
+
# cont << "</ol>"
|
15
|
+
# cont
|
16
|
+
#end
|
17
17
|
|
18
18
|
def render_item_tree_table(itm, level = 1, indx = 0)
|
19
19
|
cont = []
|
@@ -0,0 +1,71 @@
|
|
1
|
+
<%= form_with(model: quotation_item_distribution) do |form| %>
|
2
|
+
<% if quotation_item_distribution.errors.any? %>
|
3
|
+
<div style="color: red">
|
4
|
+
<h2><%= pluralize(quotation_item_distribution.errors.count, "error") %> prohibited this quotation_item_distribution from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% quotation_item_distribution.errors.each do |error| %>
|
8
|
+
<li><%= error.full_message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<h4>Source Quotation Item</h4>
|
15
|
+
<table class="table">
|
16
|
+
<tr>
|
17
|
+
<th>Destination Quotation Item</th>
|
18
|
+
<th>Line Total</th>
|
19
|
+
</tr>
|
20
|
+
<tr>
|
21
|
+
<td><%= @quotation_item.name %></td>
|
22
|
+
<td><%= currency(@quotation_item.line_total) %></td>
|
23
|
+
</tr>
|
24
|
+
</table>
|
25
|
+
|
26
|
+
<%= form.hidden_field :quotation_item_id, value: @quotation_item.id %>
|
27
|
+
|
28
|
+
<h4>Select Destination Quotation Item</h4>
|
29
|
+
<table class="table" id="details">
|
30
|
+
|
31
|
+
<tr>
|
32
|
+
<th width="38%">Name</th>
|
33
|
+
<th class="text-center">Quantity</th>
|
34
|
+
<th class="text-center">Unit</th>
|
35
|
+
<th class="text-end">Unit Price</th>
|
36
|
+
<th class="text-end">Line Total</th>
|
37
|
+
<th width="138px;"> </th>
|
38
|
+
</tr>
|
39
|
+
|
40
|
+
<% indx = 0 %>
|
41
|
+
<% @quotation.quotation_items.where(["parent_id is null"]).each do |i| %>
|
42
|
+
|
43
|
+
<% next if i.id == @quotation_item.id %>
|
44
|
+
|
45
|
+
<%= render "quotation_item", quotation_item: i, level: 0, index: indx, f: form %>
|
46
|
+
|
47
|
+
<% indx += 1 %>
|
48
|
+
|
49
|
+
<% iindx = 0 %>
|
50
|
+
<% i.children.each do |c| %>
|
51
|
+
<%= render "quotation_item", quotation_item: c, level: 1, index: iindx, f: form %>
|
52
|
+
<% iindx += 1 %>
|
53
|
+
<%= render_item_tree_table(c, 1, iindx).join.html_safe %>
|
54
|
+
<% end %>
|
55
|
+
|
56
|
+
|
57
|
+
<% end %>
|
58
|
+
|
59
|
+
<tr>
|
60
|
+
<td></td>
|
61
|
+
<td></td>
|
62
|
+
<td></td>
|
63
|
+
<td></td>
|
64
|
+
<td colspan="2" class="text-end"><%= form.submit class: "btn btn-primary" %></td>
|
65
|
+
</tr>
|
66
|
+
|
67
|
+
|
68
|
+
</table>
|
69
|
+
|
70
|
+
|
71
|
+
<% end %>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
<tr style="background-color: <%= level_marker(level) %>">
|
3
|
+
<td>
|
4
|
+
<%= (" * " * level).html_safe %>
|
5
|
+
<%= index+1 %>.
|
6
|
+
<%= quotation_item.name %>
|
7
|
+
</td>
|
8
|
+
<td class="text-center"><%= quotation_item.quantity %></td>
|
9
|
+
<td class="text-first"><%= quotation_item.unit %></td>
|
10
|
+
<td class="text-end">
|
11
|
+
<%= currency(quotation_item.unit_price) %>
|
12
|
+
</td>
|
13
|
+
<td class="text-end">
|
14
|
+
|
15
|
+
<% if quotation_item.is_consolidation_destination_item? %>
|
16
|
+
<%= currency(quotation_item.consolidated_line_total) %>
|
17
|
+
<% else %>
|
18
|
+
<%= currency(quotation_item.line_total) %>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
</td>
|
22
|
+
|
23
|
+
<td>
|
24
|
+
<%= f.text_field "quantum[#{quotation_item.id}]", multiple: true, class: "form-control text-center" %>
|
25
|
+
</td>
|
26
|
+
|
27
|
+
</tr>
|
28
|
+
|
29
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h1>Editing quotation item distribution</h1>
|
2
|
+
|
3
|
+
<%= render "form", quotation_item_distribution: @quotation_item_distribution %>
|
4
|
+
|
5
|
+
<br>
|
6
|
+
|
7
|
+
<div>
|
8
|
+
<%= link_to "Show this quotation item distribution", @quotation_item_distribution %> |
|
9
|
+
<%= link_to "Back to quotation item distributions", quotation_item_distributions_path %>
|
10
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<h1>Quotation item distributions</h1>
|
4
|
+
|
5
|
+
<div id="quotation_item_distributions">
|
6
|
+
<% @quotation_item_distributions.each do |quotation_item_distribution| %>
|
7
|
+
<%= render quotation_item_distribution %>
|
8
|
+
<p>
|
9
|
+
<%= link_to "Show this quotation item distribution", quotation_item_distribution %>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= link_to "New quotation item distribution", new_quotation_item_distribution_path %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<%= render @quotation_item_distribution %>
|
4
|
+
|
5
|
+
<div>
|
6
|
+
<%= link_to "Edit this quotation item distribution", edit_quotation_item_distribution_path(@quotation_item_distribution) %> |
|
7
|
+
<%= link_to "Back to quotation item distributions", quotation_item_distributions_path %>
|
8
|
+
|
9
|
+
<%= button_to "Destroy this quotation item distribution", @quotation_item_distribution, method: :delete %>
|
10
|
+
</div>
|
@@ -1,16 +1,33 @@
|
|
1
1
|
<div id="<%= dom_id quotation_item %>">
|
2
2
|
|
3
|
-
<tr>
|
4
|
-
<
|
5
|
-
|
6
|
-
|
7
|
-
<td
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
<td><%=
|
13
|
-
<td
|
3
|
+
<tr style="background-color: <%= level_marker(level) %>">
|
4
|
+
<td>
|
5
|
+
<%= f.check_box :sel_qi, multiple: true %>
|
6
|
+
</td>
|
7
|
+
<td>
|
8
|
+
<%= (" * " * level).html_safe %>
|
9
|
+
<%= index+1 %>.
|
10
|
+
<%= quotation_item.name %>
|
11
|
+
</td>
|
12
|
+
<td class="text-center"><%= quotation_item.quantity %></td>
|
13
|
+
<td class="text-first"><%= quotation_item.unit %></td>
|
14
|
+
<td class="text-end">
|
15
|
+
<%= currency(quotation_item.unit_price) %>
|
16
|
+
</td>
|
17
|
+
<td class="text-end">
|
18
|
+
|
19
|
+
<% if quotation_item.is_consolidation_destination_item? %>
|
20
|
+
<%= currency(quotation_item.consolidated_line_total) %>
|
21
|
+
<% else %>
|
22
|
+
<%= currency(quotation_item.line_total) %>
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
</td>
|
26
|
+
|
27
|
+
<td>
|
28
|
+
<%= f.text_field :quantum, class: "form-control" %>
|
29
|
+
</td>
|
30
|
+
|
14
31
|
</tr>
|
15
32
|
|
16
33
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
<h2>Distribute Quotation Item</h2>
|
3
|
+
|
4
|
+
<table class="table" id="details">
|
5
|
+
|
6
|
+
<tr>
|
7
|
+
<th></th>
|
8
|
+
<th width="38%">Name</th>
|
9
|
+
<th class="text-center">Quantity</th>
|
10
|
+
<th class="text-center">Unit</th>
|
11
|
+
<th class="text-end">Unit Price</th>
|
12
|
+
<th class="text-end">Line Total</th>
|
13
|
+
<th> </th>
|
14
|
+
</tr>
|
15
|
+
|
16
|
+
<%= form_for :quotation_item do |f| %>
|
17
|
+
|
18
|
+
<% indx = 0 %>
|
19
|
+
<% @quotation.quotation_items.where(["parent_id is null"]).each do |i| %>
|
20
|
+
|
21
|
+
<%= render "quotation_item", quotation_item: i, level: 0, index: indx, f: f %>
|
22
|
+
|
23
|
+
<% indx += 1 %>
|
24
|
+
|
25
|
+
<% iindx = 0 %>
|
26
|
+
<% i.children.each do |c| %>
|
27
|
+
<%= render "quotation_item", quotation_item: c, level: 1, index: iindx, f: f %>
|
28
|
+
<% iindx += 1 %>
|
29
|
+
<%= render_item_tree_table(c, 1, iindx).join.html_safe %>
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<% end %>
|
33
|
+
|
34
|
+
<tr>
|
35
|
+
<td></td>
|
36
|
+
<td></td>
|
37
|
+
<td></td>
|
38
|
+
<td></td>
|
39
|
+
<td></td>
|
40
|
+
<td class="text-end"><%= f.submit "Create Distribution", class: "btn btn-primary" %></td>
|
41
|
+
<td></td>
|
42
|
+
</tr>
|
43
|
+
|
44
|
+
<% end %>
|
45
|
+
|
46
|
+
</table>
|
47
|
+
|
@@ -15,6 +15,7 @@
|
|
15
15
|
<%= link_to image_tag('icon-hide.png', size: "20x20"), hide_children_quotation_item_url(quotation_item), data: { turbo_method: :post } %>
|
16
16
|
<% end %>
|
17
17
|
<% end %>
|
18
|
+
<%= link_to "Distribute", new_quotation_item_distribution_url(source_quotation_item: quotation_item) %>
|
18
19
|
</td>
|
19
20
|
<td class="text-center"><%= quotation_item.quantity %></td>
|
20
21
|
<td class="text-first"><%= quotation_item.unit %></td>
|
@@ -34,8 +35,17 @@
|
|
34
35
|
<% end %>
|
35
36
|
</div>
|
36
37
|
</td>
|
38
|
+
|
37
39
|
<td class="text-end">
|
38
|
-
|
40
|
+
|
41
|
+
<% if quotation_item.is_consolidation_destination_item? %>
|
42
|
+
<%= currency(quotation_item.consolidated_line_total) %>
|
43
|
+
<% elsif quotation_item.is_consolidation_source_item? %>
|
44
|
+
<%= currency(quotation_item.balance_after_distribution[:balance_amount]) %> *
|
45
|
+
<% else %>
|
46
|
+
<%= currency(quotation_item.line_total) %>
|
47
|
+
<% end %>
|
48
|
+
|
39
49
|
<div class="collapse" id="dist<%= quotation_item.id %>">
|
40
50
|
<%= form_for(:quotation_item, url: apply_discount_quotation_item_path(quotation_item), method: :post) do |f| %>
|
41
51
|
<%= f.hidden_field :discount_on, value: :line_total %>
|
@@ -56,12 +66,28 @@
|
|
56
66
|
<% end %>
|
57
67
|
</div>
|
58
68
|
</td>
|
69
|
+
|
70
|
+
<td class="text-end">
|
71
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
72
|
+
<%= link_to currency(quotation_item.discount), "#dist#{quotation_item.id}", "data-bs-toggle" => "collapse", "aria-expanded" => "false", "aria-controls" => "dist#{quotation_item.id}", role: "button" %>
|
73
|
+
<% end %>
|
74
|
+
</td>
|
75
|
+
|
76
|
+
<td>
|
77
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
78
|
+
(<%= quotation_item.discount.percent_of(quotation_item.line_total,2) %>%)
|
79
|
+
<% end %>
|
80
|
+
</td>
|
81
|
+
|
59
82
|
<td class="text-end">
|
60
|
-
|
83
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
84
|
+
<%= currency(quotation_item.line_total_after_discount) %>
|
85
|
+
<% end %>
|
61
86
|
</td>
|
62
|
-
|
63
|
-
<td class="text-end"><%= currency(quotation_item.line_total_after_discount) %></td>
|
87
|
+
|
64
88
|
<td class="text-end">
|
89
|
+
|
90
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
65
91
|
<%= link_to currency(quotation_item.tax), "#tax#{quotation_item.id}", "data-bs-toggle" => "collapse", "aria-expanded" => "false", "aria-controls" => "tax#{quotation_item.id}", role: "button" %>
|
66
92
|
<div class="collapse" id="tax<%= quotation_item.id %>">
|
67
93
|
<%= form_for(:quotation_item, url: apply_tax_quotation_item_path(quotation_item), method: :post) do |f| %>
|
@@ -81,16 +107,63 @@
|
|
81
107
|
</table>
|
82
108
|
<% end %>
|
83
109
|
</div>
|
84
|
-
|
110
|
+
<% end %>
|
111
|
+
</td>
|
112
|
+
|
113
|
+
<td>
|
114
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
115
|
+
<%= link_to image_tag('taxfree.png', size: "22x22"), remove_tax_quotation_item_path(quotation_item), data: { turbo_method: "post" } %>
|
116
|
+
<% end %>
|
117
|
+
</td>
|
118
|
+
|
119
|
+
<td class="text-end">
|
120
|
+
<% if not quotation_item.is_consolidation_source_item? %>
|
121
|
+
<%= currency(quotation_item.line_total_with_tax) %>
|
122
|
+
<% end %>
|
85
123
|
</td>
|
86
|
-
|
87
|
-
<td class="text-end"><%= currency(quotation_item.line_total_with_tax) %></td>
|
124
|
+
|
88
125
|
<td>
|
89
126
|
<%= link_to image_tag('edit.png'), edit_quotation_quotation_item_path(quotation_item.quotation, quotation_item) %>
|
90
127
|
<%= link_to image_tag('Delete.png'), quotation_item_path(quotation_item), dataz: { turbo_method: :delete, turbo_confirm: "Delete this item?" } %>
|
91
128
|
</td>
|
92
129
|
</tr>
|
93
130
|
|
131
|
+
|
132
|
+
<% if quotation_item.is_consolidation_destination_item? %>
|
133
|
+
|
134
|
+
<tr style="background-color: <%= level_marker(level) %>">
|
135
|
+
<td class="text-end" style="font-style: italic"><%= quotation_item.name %> (Existing Value)</td>
|
136
|
+
<td></td>
|
137
|
+
<td></td>
|
138
|
+
<td></td>
|
139
|
+
<td class="text-end" style="font-style: italic"><%= currency(quotation_item.line_total) %></td>
|
140
|
+
<td></td>
|
141
|
+
<td></td>
|
142
|
+
<td></td>
|
143
|
+
<td></td>
|
144
|
+
<td></td>
|
145
|
+
<td></td>
|
146
|
+
<td></td>
|
147
|
+
</tr>
|
148
|
+
|
149
|
+
<% quotation_item.source_quotation_items_link.each do |s| %>
|
150
|
+
<% cal = YAML.load(s.distribution_calculations) %>
|
151
|
+
<tr style="background-color: <%= level_marker(level) %>">
|
152
|
+
<td class="text-end" style="font-style: italic">Distributed from : <%= s.quotation_item.name %> </td>
|
153
|
+
<td colspan="3" style="font-style: italic" class="">(<%= distribution_params(cal.params) %> from total <%= currency(s.quotation_item.consolidated_line_total) %>)</td>
|
154
|
+
<td class="text-end" style="font-style: italic"><%= currency(cal.result[Smerp::Quotation::DistributionCalculator::DistributedAmount]) %></td>
|
155
|
+
<td><%= button_to "X", quotation_item_distribution_path(s), method: :delete, class: "btn btn-danger" %></td>
|
156
|
+
<td></td>
|
157
|
+
<td></td>
|
158
|
+
<td></td>
|
159
|
+
<td></td>
|
160
|
+
<td></td>
|
161
|
+
<td></td>
|
162
|
+
</tr>
|
163
|
+
<% end %>
|
164
|
+
<% end %>
|
165
|
+
|
166
|
+
|
94
167
|
</div>
|
95
168
|
|
96
169
|
|
@@ -31,6 +31,9 @@
|
|
31
31
|
<%= link_to "Back", quotations_path, class: "btn btn-secondary" %>
|
32
32
|
<%= link_to "Edit", edit_quotation_path(@quotation), class: "btn btn-warning" %>
|
33
33
|
<%= link_to "Add/Edit Extended Calculator", extended_calculators_quotation_path(@quotation), class: "btn btn-info" %>
|
34
|
+
<div style="clear: left; float: right;" class="text-end">
|
35
|
+
<%= button_to "Delete Quotation", @quotation, method: :delete, class: "btn btn-danger" %>
|
36
|
+
</div>
|
34
37
|
|
35
38
|
<table class="table">
|
36
39
|
|
data/config/routes.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
Smerp::Quotation::Engine::Engine.routes.draw do
|
2
|
+
|
2
3
|
resources :quotation_product_categories
|
3
4
|
resources :quotation_products
|
4
5
|
|
@@ -41,9 +42,14 @@ Smerp::Quotation::Engine::Engine.routes.draw do
|
|
41
42
|
|
42
43
|
post :hide_children
|
43
44
|
post :show_children
|
45
|
+
|
46
|
+
#resources :quotation_item_distributions #, as: :distribution
|
47
|
+
|
44
48
|
end
|
45
49
|
end # quotation_items
|
46
50
|
|
51
|
+
resources :quotation_item_distributions #, as: :distribution
|
52
|
+
|
47
53
|
resources :quotation_item_groups do
|
48
54
|
resources :quotation_items
|
49
55
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smerp-quotation-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -42,72 +42,72 @@ dependencies:
|
|
42
42
|
name: smerp-common
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.1.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.1.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ca-data_store
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.1.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.1.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: ca-data_store-ar
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.1.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 0.1.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: smerp-quotation
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 0.2.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 0.2.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: devops_assist
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 0.3.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 0.3.0
|
111
111
|
description: ''
|
112
112
|
email:
|
113
113
|
- cameronian0@protonmail.com
|
@@ -121,12 +121,14 @@ files:
|
|
121
121
|
- app/assets/config/smerp_quotation_engine_manifest.js
|
122
122
|
- app/assets/stylesheets/smerp/quotation/engine/application.css
|
123
123
|
- app/controllers/smerp/quotation/engine/application_controller.rb
|
124
|
+
- app/controllers/smerp/quotation/engine/quotation_item_distributions_controller.rb
|
124
125
|
- app/controllers/smerp/quotation/engine/quotation_item_groups_controller.rb
|
125
126
|
- app/controllers/smerp/quotation/engine/quotation_items_controller.rb
|
126
127
|
- app/controllers/smerp/quotation/engine/quotation_product_categories_controller.rb
|
127
128
|
- app/controllers/smerp/quotation/engine/quotation_products_controller.rb
|
128
129
|
- app/controllers/smerp/quotation/engine/quotations_controller.rb
|
129
130
|
- app/helpers/smerp/quotation/engine/application_helper.rb
|
131
|
+
- app/helpers/smerp/quotation/engine/quotation_item_distributions_helper.rb
|
130
132
|
- app/helpers/smerp/quotation/engine/quotation_item_groups_helper.rb
|
131
133
|
- app/helpers/smerp/quotation/engine/quotation_items_helper.rb
|
132
134
|
- app/helpers/smerp/quotation/engine/quotation_product_categories_helper.rb
|
@@ -137,12 +139,19 @@ files:
|
|
137
139
|
- app/models/smerp/quotation/engine/application_record.rb
|
138
140
|
- app/models/smerp/quotation/engine/quotation.rb
|
139
141
|
- app/models/smerp/quotation/engine/quotation_item.rb
|
142
|
+
- app/models/smerp/quotation/engine/quotation_item_distribution.rb
|
140
143
|
- app/models/smerp/quotation/engine/quotation_item_group.rb
|
141
144
|
- app/models/smerp/quotation/engine/quotation_product.rb
|
142
145
|
- app/models/smerp/quotation/engine/quotation_product_category.rb
|
143
146
|
- app/views/layouts/smerp/quotation/engine/application.html.erb
|
144
|
-
- app/views/smerp/quotation/engine/_new_quotation_item_form.html.erb
|
145
147
|
- app/views/smerp/quotation/engine/extended_calculators/extended_calculators.html.erb
|
148
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/_form.html.erb
|
149
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/_quotation_item.html.erb
|
150
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/_quotation_item_distribution.html.erb
|
151
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/edit.html.erb
|
152
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/index.html.erb
|
153
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/new.html.erb
|
154
|
+
- app/views/smerp/quotation/engine/quotation_item_distributions/show.html.erb
|
146
155
|
- app/views/smerp/quotation/engine/quotation_item_groups/_form.html.erb
|
147
156
|
- app/views/smerp/quotation/engine/quotation_item_groups/_quotation_item_group.html.erb
|
148
157
|
- app/views/smerp/quotation/engine/quotation_item_groups/edit.html.erb
|
@@ -152,6 +161,7 @@ files:
|
|
152
161
|
- app/views/smerp/quotation/engine/quotation_items/_form.html.erb
|
153
162
|
- app/views/smerp/quotation/engine/quotation_items/_product_item_form.html.erb
|
154
163
|
- app/views/smerp/quotation/engine/quotation_items/_quotation_item.html.erb
|
164
|
+
- app/views/smerp/quotation/engine/quotation_items/distribute.html.erb
|
155
165
|
- app/views/smerp/quotation/engine/quotation_items/edit.html.erb
|
156
166
|
- app/views/smerp/quotation/engine/quotation_items/index.html.erb
|
157
167
|
- app/views/smerp/quotation/engine/quotation_items/new.html.erb
|
@@ -1,48 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
<% parent = (defined?(group).nil? ? @quotation : group) %>
|
4
|
-
<% url = (defined?(group).nil? ? quotation_quotation_items_path(@quotation) : quotation_item_group_quotation_items_path(group)) %>
|
5
|
-
|
6
|
-
<%= form_with(model: @qi, url: url, method: :post) do |f| %>
|
7
|
-
<% if @qi.errors.any? %>
|
8
|
-
<div style="color: red">
|
9
|
-
<h2><%= pluralize(@qi.errors.count, "error") %> prohibited this quotation_item from being saved:</h2>
|
10
|
-
|
11
|
-
<ul>
|
12
|
-
<% @qi.errors.each do |error| %>
|
13
|
-
<li><%= error.full_message %></li>
|
14
|
-
<% end %>
|
15
|
-
</ul>
|
16
|
-
</div>
|
17
|
-
<% end %>
|
18
|
-
|
19
|
-
<% if not defined?(group).nil? %>
|
20
|
-
<%= f.hidden_field :quotation_item_group_id, value: group.id %>
|
21
|
-
<% else %>
|
22
|
-
<%= f.hidden_field :quotation_id, value: @quotation.id %>
|
23
|
-
<% end %>
|
24
|
-
|
25
|
-
<div class="row pb-1">
|
26
|
-
<div class="col-10">
|
27
|
-
<%= f.select :parent_is, @parent, {}, class: "form-control" %>
|
28
|
-
</div>
|
29
|
-
</div>
|
30
|
-
|
31
|
-
<div class="row pb-1">
|
32
|
-
<div class="col-6"><%= f.text_field :name, placeholder: (defined?(group).nil?) ? "Item" : "Sub Item Under Group #{group.name}", class: "form-control" %></div>
|
33
|
-
<div class="col-1"><%= f.text_field :quantity, placeholder: "Quantity", class: "form-control" %></div>
|
34
|
-
<div class="col-1"><%= f.text_field :unit, placeholder: "Unit", class: "form-control" %></div>
|
35
|
-
<div class="col-1"><%= f.text_field :unit_price, placeholder: "Unit Price", class: "form-control" %></div>
|
36
|
-
<div class="col-1">
|
37
|
-
<%= f.text_field :discount, placeholder: "Discount", class: "form-control" %>
|
38
|
-
<%= f.select :discount_unit, [["Percent","percent"],["Value","value"]], {}, class: "form-control" %>
|
39
|
-
</div>
|
40
|
-
<div class="col-1">
|
41
|
-
<%= f.text_field :tax, placeholder: "Tax", class: "form-control" %>
|
42
|
-
<%= f.select :tax_unit, [["Percent","percent"],["Value","value"]], {}, class: "form-control" %>
|
43
|
-
</div>
|
44
|
-
<div class="col-1"><%= f.submit "Create" %></div>
|
45
|
-
</div>
|
46
|
-
|
47
|
-
<% end %>
|
48
|
-
|