vyapari 0.1.5dev3 → 0.1.5dev4
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/vyapari/application_controller.rb +1 -2
- data/app/controllers/vyapari/store_manager/base_controller.rb +2 -0
- data/app/controllers/vyapari/store_manager/reports/stock_controller.rb +132 -0
- data/app/controllers/vyapari/store_manager/stock_entries_controller.rb +3 -3
- data/app/controllers/vyapari/terminal_staff/invoices_controller.rb +10 -0
- data/app/controllers/vyapari/terminal_staff/line_items_controller.rb +5 -0
- data/app/models/invoice.rb +18 -1
- data/app/models/line_item.rb +3 -2
- data/app/models/stock_entry.rb +3 -0
- data/app/models/store.rb +54 -0
- data/app/views/vyapari/store_manager/dashboard/index.html.erb +17 -18
- data/app/views/vyapari/store_manager/reports/stock/_index.html.erb +72 -0
- data/app/views/vyapari/store_manager/reports/stock/index.html.erb +32 -0
- data/app/views/vyapari/store_manager/stock_entries/_index.html.erb +1 -1
- data/app/views/vyapari/terminal_staff/dashboard/_counts.html.erb +7 -7
- data/app/views/vyapari/terminal_staff/dashboard/index.html.erb +2 -2
- data/app/views/vyapari/terminal_staff/invoices/_show.html.erb +3 -3
- data/config/routes.rb +2 -1
- data/lib/vyapari/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86dac64cf698fda0ff1b7b40c71d5a547d584f3e
|
4
|
+
data.tar.gz: 2b5c2e4e0f94e4f5f22dedbbf074bd05086bdb23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0af9fb6fee9286773cf6325c20bfc6c6fbb2794047d6b1d625b2426e95b5a330f0db001ad797387a90e1071e53414eed8c1c1136d810a00abccd1c6b2d5b2c85
|
7
|
+
data.tar.gz: f9fafbdcf3e5dc91daf9108e6bd9bc1d555da479ca9a8f377546e49bed223ead0313c70c8ce3d6908ceb4a44f2ccf576fa4a2056ec76d61574fa96cb51567965
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Vyapari
|
2
|
+
module StoreManager
|
3
|
+
module Reports
|
4
|
+
class StockController < Vyapari::StoreManager::BaseController
|
5
|
+
|
6
|
+
|
7
|
+
# select MAX(p.id) as id, MAX(p.name) as name,
|
8
|
+
# MAX(p.ean_sku) as ean_sku,
|
9
|
+
# MAX(p.purchased_price) as purchased_price,
|
10
|
+
# MAX(p.landed_price) as landed_price,
|
11
|
+
# MAX(p.selling_price) as selling_price,
|
12
|
+
# MAX(p.retail_price) as retail_price,
|
13
|
+
# SUM(se.quantity) as se_quantity,
|
14
|
+
# MAX(se.status) as se_status
|
15
|
+
# from products p left join stock_entries se
|
16
|
+
# on se.product_id = p.id group by p.id;
|
17
|
+
def index
|
18
|
+
@relation = Product.select("MAX(products.id) as id,
|
19
|
+
MAX(products.name) as name,
|
20
|
+
MAX(products.ean_sku) as ean_sku,
|
21
|
+
MAX(products.purchased_price) as purchased_price,
|
22
|
+
MAX(products.landed_price) as landed_price,
|
23
|
+
MAX(products.selling_price) as selling_price,
|
24
|
+
MAX(products.retail_price) as retail_price,
|
25
|
+
MAX(se.status) as se_status,
|
26
|
+
SUM(se.quantity) as se_quantity").
|
27
|
+
joins("LEFT JOIN stock_entries se ON se.product_id = products.id")
|
28
|
+
|
29
|
+
parse_filters
|
30
|
+
apply_filters
|
31
|
+
|
32
|
+
@results = @relation.group("products.id")
|
33
|
+
@total = @relation.except(:select).
|
34
|
+
select("SUM(products.id) as id,
|
35
|
+
SUM(products.purchased_price) as purchased_price,
|
36
|
+
SUM(products.landed_price) as landed_price,
|
37
|
+
SUM(products.selling_price) as selling_price,
|
38
|
+
SUM(products.retail_price) as retail_price")
|
39
|
+
|
40
|
+
render_report
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def apply_filters
|
46
|
+
@relation = @relation.search(@query) if @query
|
47
|
+
# @relation = @relation.where("se.se_status = ?", @status) if @status
|
48
|
+
|
49
|
+
@order_by = "products.name ASC, products.ean_sku ASC" unless @order_by
|
50
|
+
@relation = @relation.order(@order_by)
|
51
|
+
end
|
52
|
+
|
53
|
+
def configure_filter_settings
|
54
|
+
@filter_settings = {
|
55
|
+
string_filters: [
|
56
|
+
{ filter_name: :query },
|
57
|
+
{ filter_name: :status, options: {default: :pending} }
|
58
|
+
],
|
59
|
+
|
60
|
+
reference_filters: [
|
61
|
+
{ filter_name: :brand, filter_class: Brand },
|
62
|
+
{ filter_name: :category, filter_class: Category },
|
63
|
+
],
|
64
|
+
|
65
|
+
variable_filters: [
|
66
|
+
{ variable_name: :store, filter_name: :store },
|
67
|
+
{ variable_name: :terminal, filter_name: :terminal },
|
68
|
+
]
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def configure_filter_ui_settings
|
73
|
+
@filter_ui_settings = {}
|
74
|
+
end
|
75
|
+
|
76
|
+
def filter_config_ui
|
77
|
+
return @filter_config_ui if @filter_config_ui
|
78
|
+
@filter_config_ui = {
|
79
|
+
brand: {
|
80
|
+
object_filter: true,
|
81
|
+
display_name: 'Select Brand',
|
82
|
+
current_value: @brand,
|
83
|
+
values: Brand.order(:name).all,
|
84
|
+
current_filters: @filters,
|
85
|
+
url_method_name: 'root_url',
|
86
|
+
filters_to_remove: [:terminal, :store],
|
87
|
+
filters_to_add: {},
|
88
|
+
show_null_filter_on_top: true
|
89
|
+
},
|
90
|
+
category: {
|
91
|
+
object_filter: true,
|
92
|
+
display_name: 'Select Brand Category',
|
93
|
+
current_value: @category,
|
94
|
+
values: Category.order(:name).all,
|
95
|
+
current_filters: @filters,
|
96
|
+
url_method_name: 'root_url',
|
97
|
+
filters_to_remove: [:terminal, :store],
|
98
|
+
filters_to_add: {},
|
99
|
+
show_null_filter_on_top: true
|
100
|
+
}
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
def breadcrumbs_configuration
|
105
|
+
{
|
106
|
+
heading: "Stock Report",
|
107
|
+
description: "In Stock Report",
|
108
|
+
links: [{name: "Home", link: user_dashboard_path, icon: 'fa-dashboard'},
|
109
|
+
{name: "Reports", link: user_dashboard_path, icon: 'fa-calendar', active: true}]
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def set_navs
|
114
|
+
set_nav("reports/stock")
|
115
|
+
end
|
116
|
+
|
117
|
+
def render_report
|
118
|
+
respond_to do |format|
|
119
|
+
format.html {}
|
120
|
+
format.csv { send_data generate_csv(@results), filename: "#{params[:action]}_#{Date.today}.csv" }
|
121
|
+
format.pdf do
|
122
|
+
render :pdf => "#{@heading} (As on #{Date.today})"
|
123
|
+
#:disposition => 'attachment'
|
124
|
+
#:show_as_html => true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -80,7 +80,7 @@ module Vyapari
|
|
80
80
|
private
|
81
81
|
|
82
82
|
def get_collections
|
83
|
-
@relation = @store.stock_entries.where("")
|
83
|
+
@relation = @store.stock_entries.includes(:product, :supplier).where("")
|
84
84
|
|
85
85
|
parse_filters
|
86
86
|
apply_filters
|
@@ -130,7 +130,7 @@ module Vyapari
|
|
130
130
|
collection_name: :stock_entries,
|
131
131
|
item_name: :stock_entry,
|
132
132
|
class: StockEntry,
|
133
|
-
page_title: "#{@store.name} - Stock
|
133
|
+
page_title: "#{@store.name} - Stock",
|
134
134
|
js_view_path: "/kuppayam/workflows/parrot",
|
135
135
|
view_path: "/vyapari/store_manager/stock_entries"
|
136
136
|
}
|
@@ -138,7 +138,7 @@ module Vyapari
|
|
138
138
|
|
139
139
|
def breadcrumbs_configuration
|
140
140
|
{
|
141
|
-
heading: "#{@store.name} - Stock
|
141
|
+
heading: "#{@store.name} - Stock",
|
142
142
|
description: "Listing all the stock at #{@store.name}",
|
143
143
|
links: [
|
144
144
|
{name: "Home", link: user_dashboard_path, icon: 'fa-dashboard'},
|
@@ -33,9 +33,19 @@ module Vyapari
|
|
33
33
|
@invoice.assign_attributes(permitted_params)
|
34
34
|
|
35
35
|
if @invoice.valid?
|
36
|
+
|
37
|
+
# Save Invoice
|
36
38
|
@invoice.save
|
39
|
+
|
40
|
+
# Generating a real invoice number
|
37
41
|
@invoice.generate_real_invoice_number!
|
42
|
+
|
43
|
+
# Activatingthe Invoice
|
38
44
|
@invoice.activate!
|
45
|
+
|
46
|
+
# Updating the stock register
|
47
|
+
@invoice.update_stock_register!
|
48
|
+
|
39
49
|
set_notification(true, @invoice.invoice_number, "Invoice '#{@invoice.invoice_number}' SAVED")
|
40
50
|
else
|
41
51
|
error_message = @invoice.invoice_number || I18n.t('status.error')
|
@@ -43,6 +43,9 @@ module Vyapari
|
|
43
43
|
# recalculate the gross total amount
|
44
44
|
@invoice.reload.save
|
45
45
|
|
46
|
+
# Updating the stock register
|
47
|
+
@invoice.update_stock_register!
|
48
|
+
|
46
49
|
set_notification(true, @line_item.product.ean_sku, "Line Item '#{@line_item.product.name}' ADDED")
|
47
50
|
else
|
48
51
|
if product
|
@@ -70,6 +73,8 @@ module Vyapari
|
|
70
73
|
# recalculate the gross total amount
|
71
74
|
@invoice.reload.save
|
72
75
|
|
76
|
+
@invoice.update_stock_register!
|
77
|
+
|
73
78
|
get_collections
|
74
79
|
set_flash_message(I18n.t('success.deleted'), :success)
|
75
80
|
set_notification(false, I18n.t('status.success'), I18n.t('success.deleted', item: default_item_name.titleize))
|
data/app/models/invoice.rb
CHANGED
@@ -55,6 +55,7 @@ class Invoice < Vyapari::ApplicationRecord
|
|
55
55
|
scope :cheque_invoices, -> { where(payment_method: CHEQUE) }
|
56
56
|
|
57
57
|
scope :this_month, lambda { where("created_at >= ? AND created_at <= ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) }
|
58
|
+
scope :today, lambda { where('DATE(created_at) = ?', Date.today)}
|
58
59
|
|
59
60
|
# ------------------
|
60
61
|
# Instance Methods
|
@@ -130,6 +131,7 @@ class Invoice < Vyapari::ApplicationRecord
|
|
130
131
|
# => "active"
|
131
132
|
def activate!
|
132
133
|
self.update_attributes(status: ACTIVE)
|
134
|
+
#self.line_items.update_attributes(status: LineItem::SOLD)
|
133
135
|
end
|
134
136
|
|
135
137
|
# * Return true if the invoice is cancelled, else false.
|
@@ -146,7 +148,8 @@ class Invoice < Vyapari::ApplicationRecord
|
|
146
148
|
# >>> invoice.remove!
|
147
149
|
# => "cancelled"
|
148
150
|
def cancel!
|
149
|
-
self.update_attributes(status: CANCELLED
|
151
|
+
self.update_attributes(status: CANCELLED)
|
152
|
+
#self.line_items.update_attributes(status: LineItem::CANCELLED)
|
150
153
|
end
|
151
154
|
|
152
155
|
# * Return true if the invoice is cash, else false.
|
@@ -210,6 +213,20 @@ class Invoice < Vyapari::ApplicationRecord
|
|
210
213
|
#return true
|
211
214
|
end
|
212
215
|
|
216
|
+
def update_stock_register!
|
217
|
+
return unless self.active?
|
218
|
+
self.stock_entries.destroy_all
|
219
|
+
self.line_items.each do |li|
|
220
|
+
stock_entry = StockEntry.new
|
221
|
+
stock_entry.store = self.store
|
222
|
+
stock_entry.product = li.product
|
223
|
+
stock_entry.invoice_id = self.id
|
224
|
+
stock_entry.quantity = li.quantity
|
225
|
+
stock_entry.status = LineItem::SOLD
|
226
|
+
stock_entry.save
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
213
230
|
def generate_real_invoice_number!
|
214
231
|
self.invoice_number = "INV-#{self.terminal.code}-#{self.id}"
|
215
232
|
self.save
|
data/app/models/line_item.rb
CHANGED
@@ -5,9 +5,10 @@ class LineItem < Vyapari::ApplicationRecord
|
|
5
5
|
SOLD = "sold"
|
6
6
|
DAMAGED = "damaged"
|
7
7
|
RETURNED = "returned"
|
8
|
+
CANCELLED = "cancelled"
|
8
9
|
|
9
|
-
STATUS_HASH = {"Draft" => DRAFT, "Sold" => SOLD, "Damaged" => DAMAGED, "Returned" => RETURNED}
|
10
|
-
STATUS_HASH_REVERSE = {DRAFT => "Draft", SOLD => "Sold", DAMAGED => "Damaged", RETURNED => "Returned"}
|
10
|
+
STATUS_HASH = {"Draft" => DRAFT, "Sold" => SOLD, "Damaged" => DAMAGED, "Returned" => RETURNED, "Cancelled" => CANCELLED}
|
11
|
+
STATUS_HASH_REVERSE = {DRAFT => "Draft", SOLD => "Sold", DAMAGED => "Damaged", RETURNED => "Returned", CANCELLED => "Cancelled"}
|
11
12
|
|
12
13
|
# Call backs
|
13
14
|
before_save :calculate_total_amount
|
data/app/models/stock_entry.rb
CHANGED
@@ -50,6 +50,9 @@ class StockEntry < Vyapari::ApplicationRecord
|
|
50
50
|
scope :reserved, -> { where(status: RESERVED) }
|
51
51
|
scope :in_stock, -> { where(status: [ACTIVE, RECEIVED, RETURNED]) }
|
52
52
|
|
53
|
+
scope :this_month, lambda { where("created_at >= ? AND created_at <= ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) }
|
54
|
+
scope :today, lambda { where('DATE(created_at) = ?', Date.today)}
|
55
|
+
|
53
56
|
def self.save_row_data(row)
|
54
57
|
|
55
58
|
row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
|
data/app/models/store.rb
CHANGED
@@ -131,6 +131,60 @@ class Store < Vyapari::ApplicationRecord
|
|
131
131
|
true
|
132
132
|
end
|
133
133
|
|
134
|
+
def sold_items_count_for_today
|
135
|
+
self.stock_entries.today.sold.sum(:quantity)
|
136
|
+
end
|
137
|
+
|
138
|
+
def sold_items_count_for_this_month
|
139
|
+
self.stock_entries.this_month.sold.sum(:quantity)
|
140
|
+
end
|
141
|
+
|
142
|
+
def damaged_items_count_for_today
|
143
|
+
self.stock_entries.today.damaged.sum(:quantity)
|
144
|
+
end
|
145
|
+
|
146
|
+
def damaged_items_count_for_this_month
|
147
|
+
self.stock_entries.this_month.damaged.sum(:quantity)
|
148
|
+
end
|
149
|
+
|
150
|
+
def returned_items_count_for_today
|
151
|
+
self.stock_entries.today.returned.sum(:quantity)
|
152
|
+
end
|
153
|
+
|
154
|
+
def returned_items_count_for_this_month
|
155
|
+
self.stock_entries.this_month.returned.sum(:quantity)
|
156
|
+
end
|
157
|
+
|
158
|
+
def reserved_items_count_for_today
|
159
|
+
self.stock_entries.today.reserved.sum(:quantity)
|
160
|
+
end
|
161
|
+
|
162
|
+
def reserved_items_count_for_this_month
|
163
|
+
self.stock_entries.this_month.reserved.sum(:quantity)
|
164
|
+
end
|
165
|
+
|
166
|
+
def in_stock_items_count_as_of_now
|
167
|
+
self.stock_entries.active.sum(:quantity) - self.stock_entries.sold.sum(:quantity)
|
168
|
+
end
|
169
|
+
|
170
|
+
def total_no_of_products_in_stock
|
171
|
+
self.stock_entries.active.count
|
172
|
+
# - self.stock_entries.sold.count
|
173
|
+
# self.stock_entries.active.count - self.stock_entries.sold.count
|
174
|
+
#begin
|
175
|
+
# result = Product.select("COUNT(products.id) as id, MAX(se.store_id) as store_id").
|
176
|
+
# joins("LEFT JOIN stock_entries se ON se.product_id = products.id").
|
177
|
+
# where("se.store_id = ?", self.id).
|
178
|
+
# group("products.id")
|
179
|
+
# return result.size.to_i
|
180
|
+
#rescue
|
181
|
+
#0
|
182
|
+
#end
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
134
188
|
# * Return true if the brand is active, else false.
|
135
189
|
# == Examples
|
136
190
|
# >>> brand.active?
|
@@ -1,15 +1,14 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
in_stock_count = @store.stock_entries.in_stock.count
|
4
|
-
damaged_count = @store.stock_entries.damaged.count
|
5
|
-
|
6
|
-
reserved_count = @store.stock_entries.reserved.count
|
2
|
+
#total_no_of_products_in_stock = @store.stock_entries.active.count
|
3
|
+
#in_stock_count = @store.stock_entries.in_stock.count
|
4
|
+
#damaged_count = @store.stock_entries.damaged.count
|
5
|
+
#reserved_count = @store.stock_entries.reserved.count
|
7
6
|
%>
|
8
7
|
|
9
8
|
<div class="chart-item-bg-2">
|
10
9
|
<div class="chart-item-num" data-count="this" data-from="0" data-to="98" data-suffix="%" data-duration="2">
|
11
|
-
<i class="fa-
|
12
|
-
<%=
|
10
|
+
<i class="fa-truck"></i>
|
11
|
+
<%= @store.total_no_of_products_in_stock %> <span style="font-size:20px">Products</span>
|
13
12
|
</div>
|
14
13
|
<div class="chart-item-desc">
|
15
14
|
<%= link_to raw("<i class=\"fa-truck mr-10\"></i> View Stock"), store_manager_stock_entries_path(@store), class: "btn btn-success btn-lg btn-block", style: "height:50px" %>
|
@@ -20,23 +19,23 @@
|
|
20
19
|
<div class="row">
|
21
20
|
<div class="col-sm-3">
|
22
21
|
|
23
|
-
<div class="xe-widget xe-counter xe-counter-
|
22
|
+
<div class="xe-widget xe-counter xe-counter-info" data-count=".num" data-from="1" data-to="117" data-suffix="k" data-duration="3" data-easing="false">
|
24
23
|
<div class="xe-icon">
|
25
|
-
<i class="fa-
|
24
|
+
<i class="fa-truck"></i>
|
26
25
|
</div>
|
27
26
|
<div class="xe-label">
|
28
|
-
|
29
|
-
<span>
|
27
|
+
<strong class="num"><%= @store.in_stock_items_count_as_of_now %></strong>
|
28
|
+
<span>TOTAL QUANTITY IN STOCK</span>
|
30
29
|
</div>
|
31
30
|
</div>
|
32
31
|
|
33
|
-
<div class="xe-widget xe-counter xe-counter-
|
32
|
+
<div class="xe-widget xe-counter xe-counter-success" data-count=".num" data-from="0" data-to="99.9" data-suffix="%" data-duration="2">
|
34
33
|
<div class="xe-icon">
|
35
|
-
<i class="fa-
|
34
|
+
<i class="fa-shopping-cart"></i>
|
36
35
|
</div>
|
37
36
|
<div class="xe-label">
|
38
|
-
|
39
|
-
<span>
|
37
|
+
<strong class="num"><%= @store.sold_items_count_for_today %></strong>
|
38
|
+
<span>ITEMS SOLD TODAY</span>
|
40
39
|
</div>
|
41
40
|
</div>
|
42
41
|
|
@@ -45,8 +44,8 @@
|
|
45
44
|
<i class="fa-ban"></i>
|
46
45
|
</div>
|
47
46
|
<div class="xe-label">
|
48
|
-
<strong class="num"><%=
|
49
|
-
<span>DAMAGED</span>
|
47
|
+
<strong class="num"><%= @store.damaged_items_count_for_today %></strong>
|
48
|
+
<span>ITEMS DAMAGED TODAY</span>
|
50
49
|
</div>
|
51
50
|
</div>
|
52
51
|
|
@@ -55,7 +54,7 @@
|
|
55
54
|
<i class="fa-bookmark"></i>
|
56
55
|
</div>
|
57
56
|
<div class="xe-label">
|
58
|
-
<strong class="num"><%=
|
57
|
+
<strong class="num"><%= @store.reserved_items_count_for_today %></strong>
|
59
58
|
<span>RESERVED</span>
|
60
59
|
</div>
|
61
60
|
</div>
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<div class="table-responsive table-scrollable">
|
2
|
+
<table class="table table-striped table-condensed table-bordered">
|
3
|
+
<thead>
|
4
|
+
<tr>
|
5
|
+
<th style="text-align: center;width:60px">#</th>
|
6
|
+
<th>Product Name</th>
|
7
|
+
<th style="width:15%;text-align: center;">EAN/SKU</th>
|
8
|
+
<th style="text-align: right;">PP</th>
|
9
|
+
<th style="text-align: right;">LP</th>
|
10
|
+
<th style="text-align: right;">SP</th>
|
11
|
+
<th style="text-align: right;">RP</th>
|
12
|
+
<th style="text-align: center;">Quantity</th>
|
13
|
+
<th>Status</th>
|
14
|
+
<th style="text-align: center;">Actions</th>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
|
19
|
+
<%# filters_to_add = {permalink: @current_company_group.permalink, code: @current_company.code } %>
|
20
|
+
|
21
|
+
<%# short_filters = generate_short_url_filters(@filters, filters_to_add, [:store, :terminal]) %>
|
22
|
+
|
23
|
+
<%#= link_to item.name, jobs_path(short_filters.merge(br: item.id)), target: :blank %>
|
24
|
+
|
25
|
+
<% @results.each_with_index do |item, i| %>
|
26
|
+
<tr>
|
27
|
+
<th scope="row" style="text-align: center;"><%= i + 1 + (@per_page.to_i * (@current_page.to_i - 1)) %></th>
|
28
|
+
|
29
|
+
<td>
|
30
|
+
<%= link_to item.name, "#", target: :blank %>
|
31
|
+
</td>
|
32
|
+
|
33
|
+
<td>
|
34
|
+
<%= item.ean_sku %>
|
35
|
+
</td>
|
36
|
+
|
37
|
+
<td style="text-align: right;"><%= number_to_currency item.purchased_price, unit: "AED " %></td>
|
38
|
+
|
39
|
+
<td style="text-align: right;"><%= number_to_currency item.landed_price, unit: "AED " %></td>
|
40
|
+
|
41
|
+
<td style="text-align: right;"><%= number_to_currency item.selling_price, unit: "AED " %></td>
|
42
|
+
|
43
|
+
<td style="text-align: right;"><%= number_to_currency item.retail_price, unit: "AED " %></td>
|
44
|
+
|
45
|
+
<td>
|
46
|
+
<%#= item.se_quantity %>
|
47
|
+
</td>
|
48
|
+
|
49
|
+
<td>
|
50
|
+
<%#= item.se_status %>
|
51
|
+
</td>
|
52
|
+
|
53
|
+
</tr>
|
54
|
+
<% end %>
|
55
|
+
</tbody>
|
56
|
+
<tfoot>
|
57
|
+
<% if @total && @total.first && @total.first.purchased_price %>
|
58
|
+
<tr>
|
59
|
+
<td></td>
|
60
|
+
<td></td>
|
61
|
+
<td></td>
|
62
|
+
<td style="font-weight: bold;text-align: right;"><%= number_to_currency @total.first.purchased_price.to_s, unit: "AED " %></td>
|
63
|
+
<td style="font-weight: bold;text-align: right;"><%= number_to_currency @total.first.landed_price.to_s, unit: "AED " %></td>
|
64
|
+
<td style="font-weight: bold;text-align: right;"><%= number_to_currency @total.first.selling_price.to_s, unit: "AED " %></td>
|
65
|
+
<td style="font-weight: bold;text-align: right;"><%= number_to_currency @total.first.retail_price.to_s, unit: "AED " %></td>
|
66
|
+
<td></td>
|
67
|
+
<td></td>
|
68
|
+
</tr>
|
69
|
+
<% end %>
|
70
|
+
</tfoot>
|
71
|
+
</table>
|
72
|
+
</div>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<div class="panel panel-default">
|
2
|
+
<div class="panel-heading">
|
3
|
+
Filters
|
4
|
+
</div>
|
5
|
+
<div class="panel-body">
|
6
|
+
|
7
|
+
<div id="div_report_filter_list">
|
8
|
+
<%#= render :partial=>"/reports/company_jpr/display_filters" %>
|
9
|
+
<hr>
|
10
|
+
<%= clear_tag(10) %>
|
11
|
+
<%#= render :partial=>"/reports/company_jpr/display_dropdown_filters" %>
|
12
|
+
</div>
|
13
|
+
<%= clear_tag(10) %>
|
14
|
+
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div class="panel panel-default">
|
19
|
+
<div class="panel-body">
|
20
|
+
|
21
|
+
<%= clear_tag(10) %>
|
22
|
+
|
23
|
+
<div id="div_report_index">
|
24
|
+
<%#= render :partial=>"/reports/company_jpr/chart" %>
|
25
|
+
<%#= clear_tag(100) %>
|
26
|
+
<%= render :partial=>"vyapari/store_manager/reports/stock/index" %>
|
27
|
+
</div>
|
28
|
+
<%= clear_tag(10) %>
|
29
|
+
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
@@ -34,7 +34,7 @@
|
|
34
34
|
|
35
35
|
<td class="stock_entry-name"><%= link_to stock_entry.product.name, store_manager_stock_entries_path(@store, stock_entry), remote: true %></td>
|
36
36
|
|
37
|
-
<td class="stock_entry-name" style="text-align: center;"><%=
|
37
|
+
<td class="stock_entry-name" style="text-align: center;"><%= stock_entry.product.ean_sku %></td>
|
38
38
|
|
39
39
|
<td class="stock_entry-name" style="text-align: right;">
|
40
40
|
<%= number_to_currency stock_entry.product.purchased_price, unit: "" %>
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<%
|
2
|
-
active_invoices = @terminal.invoices.active.count
|
3
|
-
draft_invoices = @terminal.invoices.draft.count
|
4
|
-
active_amount = @terminal.invoices.active.sum(:net_total_amount)
|
5
|
-
draft_amount = @terminal.invoices.draft.sum(:net_total_amount)
|
6
|
-
cash_invoices = @terminal.invoices.active.where(payment_method: :cash).count
|
7
|
-
cash_in_hand = @terminal.invoices.active.cash_invoices.sum(:net_total_amount)
|
2
|
+
active_invoices = @terminal.invoices.active.today.count
|
3
|
+
draft_invoices = @terminal.invoices.draft.today.count
|
4
|
+
active_amount = @terminal.invoices.active.today.sum(:net_total_amount)
|
5
|
+
draft_amount = @terminal.invoices.draft.today.sum(:net_total_amount)
|
6
|
+
cash_invoices = @terminal.invoices.active.today.where(payment_method: :cash).count
|
7
|
+
cash_in_hand = @terminal.invoices.active.today.cash_invoices.sum(:net_total_amount)
|
8
8
|
total_sales = 100
|
9
9
|
%>
|
10
10
|
|
@@ -55,7 +55,7 @@
|
|
55
55
|
<div class="xe-lower">
|
56
56
|
<div class="border"></div>
|
57
57
|
|
58
|
-
<span>Total Amount Billed</span>
|
58
|
+
<span>Total Amount Billed Today</span>
|
59
59
|
<strong><%= number_to_currency active_amount, unit: "AED " %></strong>
|
60
60
|
</div>
|
61
61
|
</div>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
<div class="panel-body">
|
12
12
|
<!-- Active Invoices -->
|
13
|
-
<% active_invoices = @terminal.invoices.active.order("created_at DESC").page(1).per(10) %>
|
13
|
+
<% active_invoices = @terminal.invoices.active.today.order("created_at DESC").page(1).per(10) %>
|
14
14
|
<%= render :partial=>"vyapari/terminal_staff/dashboard/invoices", locals: { invoices: active_invoices } -%>
|
15
15
|
</div>
|
16
16
|
</div>
|
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
<div class="panel-body">
|
27
27
|
<!-- Draft Invoices -->
|
28
|
-
<% draft_invoices = @terminal.invoices.draft.order("created_at DESC").page(1).per(10) %>
|
28
|
+
<% draft_invoices = @terminal.invoices.draft.today.order("created_at DESC").page(1).per(10) %>
|
29
29
|
<%= render :partial=>"vyapari/terminal_staff/dashboard/invoices", locals: { invoices: draft_invoices } -%>
|
30
30
|
</div>
|
31
31
|
|
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
<ul class="list-unstyled mt-30">
|
54
54
|
<li class="upper fs-20">Invoice No: <strong>#<%= @invoice.invoice_number%></strong></li>
|
55
|
-
<li class="mt-10">Invoice
|
55
|
+
<li class="mt-10">Invoice Date: <%= @invoice.invoice_date.strftime("%m/%d/%Y") %></li>
|
56
56
|
<!-- <li>Dubai</li> -->
|
57
57
|
</ul>
|
58
58
|
|
@@ -98,7 +98,7 @@
|
|
98
98
|
<!-- Invoice Entries -->
|
99
99
|
<table class="table table-bordered mt-60">
|
100
100
|
<thead>
|
101
|
-
<tr style="
|
101
|
+
<tr style="">
|
102
102
|
<th width="10%" class="text-center">No</th>
|
103
103
|
<th width="40%" class="text-center">Item</th>
|
104
104
|
<th width="15%" class="text-center">Unit Price</th>
|
@@ -142,7 +142,7 @@
|
|
142
142
|
|
143
143
|
<% if @invoice.discount %>
|
144
144
|
<span class="mt-10 fs-20">
|
145
|
-
Discount (<%=
|
145
|
+
Discount (<%= @invoice.discount %>) %:
|
146
146
|
<strong><%= number_to_currency @invoice.discount_amount, unit: "AED " %></strong>
|
147
147
|
</span>
|
148
148
|
<% end %>
|
data/config/routes.rb
CHANGED
@@ -56,7 +56,8 @@ Vyapari::Engine.routes.draw do
|
|
56
56
|
namespace :store_manager do
|
57
57
|
|
58
58
|
scope '/:store_id' do
|
59
|
-
get
|
59
|
+
get '/dashboard', to: "dashboard#index", as: :dashboard
|
60
|
+
get '/reports/stock', to: "reports/stock#index", as: :stock_report
|
60
61
|
resources :terminals
|
61
62
|
resources :stock_entries
|
62
63
|
resources :stock_bundles do
|
data/lib/vyapari/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vyapari
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5dev4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kpvarma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -350,6 +350,7 @@ files:
|
|
350
350
|
- app/controllers/vyapari/application_controller.rb
|
351
351
|
- app/controllers/vyapari/store_manager/base_controller.rb
|
352
352
|
- app/controllers/vyapari/store_manager/dashboard_controller.rb
|
353
|
+
- app/controllers/vyapari/store_manager/reports/stock_controller.rb
|
353
354
|
- app/controllers/vyapari/store_manager/resource_controller.rb
|
354
355
|
- app/controllers/vyapari/store_manager/stock_bundles_controller.rb
|
355
356
|
- app/controllers/vyapari/store_manager/stock_entries_controller.rb
|
@@ -437,6 +438,8 @@ files:
|
|
437
438
|
- app/views/vyapari/admin/terminals/_row.html.erb
|
438
439
|
- app/views/vyapari/admin/terminals/_show.html.erb
|
439
440
|
- app/views/vyapari/store_manager/dashboard/index.html.erb
|
441
|
+
- app/views/vyapari/store_manager/reports/stock/_index.html.erb
|
442
|
+
- app/views/vyapari/store_manager/reports/stock/index.html.erb
|
440
443
|
- app/views/vyapari/store_manager/stock_bundles/_form.html.erb
|
441
444
|
- app/views/vyapari/store_manager/stock_bundles/_index.html.erb
|
442
445
|
- app/views/vyapari/store_manager/stock_bundles/_row.html.erb
|