rawbotz 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +9 -0
- data/README.md +185 -0
- data/Rakefile +29 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config.ru +9 -0
- data/exe/debug/test_mail +15 -0
- data/exe/rawbotz +39 -0
- data/exe/rawbotz_import_links +74 -0
- data/exe/rawbotz_maintenance.sh +57 -0
- data/exe/rawbotz_process_order +86 -0
- data/exe/rawbotz_process_order_queue +80 -0
- data/exe/rawbotz_stock_update +84 -0
- data/exe/rawbotz_update_local_products +48 -0
- data/exe/rawbotz_update_remote_products +160 -0
- data/lib/rawbotz/app.rb +84 -0
- data/lib/rawbotz/cli/order_result_table.rb +57 -0
- data/lib/rawbotz/datapolate.rb +42 -0
- data/lib/rawbotz/helpers/flash_helper.rb +13 -0
- data/lib/rawbotz/helpers/icon_helper.rb +40 -0
- data/lib/rawbotz/helpers/resource_link_helper.rb +45 -0
- data/lib/rawbotz/local_shop.rb +12 -0
- data/lib/rawbotz/mail_template.rb +29 -0
- data/lib/rawbotz/option_parser.rb +37 -0
- data/lib/rawbotz/order_processor.rb +92 -0
- data/lib/rawbotz/product_updater.rb +89 -0
- data/lib/rawbotz/public/Chart.min.js +14 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/HELP-US-OUT.txt +7 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.css +2086 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.min.css +4 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/FontAwesome.otf +0 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.eot +0 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.svg +655 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf +0 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff +0 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 +0 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/animated.less +34 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/bordered-pulled.less +25 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/core.less +12 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/fixed-width.less +6 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/font-awesome.less +17 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/icons.less +697 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/larger.less +13 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/list.less +19 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/mixins.less +26 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/path.less +15 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/rotated-flipped.less +20 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/stacked.less +20 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/less/variables.less +708 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_animated.scss +34 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_bordered-pulled.scss +25 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_core.scss +12 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_fixed-width.scss +6 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_icons.scss +697 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_larger.scss +13 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_list.scss +19 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_mixins.scss +26 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_path.scss +15 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_rotated-flipped.scss +20 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_stacked.scss +20 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/_variables.scss +708 -0
- data/lib/rawbotz/public/font-awesome-4.5.0/scss/font-awesome.scss +17 -0
- data/lib/rawbotz/public/jquery-2.2.0.min.js +4 -0
- data/lib/rawbotz/public/jui/external/jquery/jquery.js +9789 -0
- data/lib/rawbotz/public/jui/images/ui-icons_444444_256x240.png +0 -0
- data/lib/rawbotz/public/jui/images/ui-icons_555555_256x240.png +0 -0
- data/lib/rawbotz/public/jui/images/ui-icons_777620_256x240.png +0 -0
- data/lib/rawbotz/public/jui/images/ui-icons_777777_256x240.png +0 -0
- data/lib/rawbotz/public/jui/images/ui-icons_cc0000_256x240.png +0 -0
- data/lib/rawbotz/public/jui/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/rawbotz/public/jui/index.html +513 -0
- data/lib/rawbotz/public/jui/jquery-ui.css +1225 -0
- data/lib/rawbotz/public/jui/jquery-ui.js +16617 -0
- data/lib/rawbotz/public/jui/jquery-ui.min.css +7 -0
- data/lib/rawbotz/public/jui/jquery-ui.min.js +13 -0
- data/lib/rawbotz/public/jui/jquery-ui.structure.css +833 -0
- data/lib/rawbotz/public/jui/jquery-ui.structure.min.css +5 -0
- data/lib/rawbotz/public/jui/jquery-ui.theme.css +410 -0
- data/lib/rawbotz/public/jui/jquery-ui.theme.min.css +5 -0
- data/lib/rawbotz/public/pure-min.css +11 -0
- data/lib/rawbotz/public/rawbotz.css +60 -0
- data/lib/rawbotz/public/rawbotz.js +96 -0
- data/lib/rawbotz/public/rawbotz_ajax_product_link.js +64 -0
- data/lib/rawbotz/remote_shop.rb +21 -0
- data/lib/rawbotz/routes/non_remote_orders.rb +45 -0
- data/lib/rawbotz/routes/orders.rb +76 -0
- data/lib/rawbotz/routes/product_links.rb +68 -0
- data/lib/rawbotz/routes/products.rb +104 -0
- data/lib/rawbotz/routes/remote_shop.rb +37 -0
- data/lib/rawbotz/routes/suppliers.rb +36 -0
- data/lib/rawbotz/routes.rb +9 -0
- data/lib/rawbotz/version.rb +3 -0
- data/lib/rawbotz/views/_hide_unhide_button.haml +11 -0
- data/lib/rawbotz/views/_menu.haml +20 -0
- data/lib/rawbotz/views/index.haml +1 -0
- data/lib/rawbotz/views/layout.haml +55 -0
- data/lib/rawbotz/views/maintenance/menu.haml +25 -0
- data/lib/rawbotz/views/maintenance.haml +150 -0
- data/lib/rawbotz/views/order/_head.haml +24 -0
- data/lib/rawbotz/views/order/_item_table.haml +44 -0
- data/lib/rawbotz/views/order/new.haml +22 -0
- data/lib/rawbotz/views/order/non_remote.haml +42 -0
- data/lib/rawbotz/views/order/packlist.haml +14 -0
- data/lib/rawbotz/views/order/view.haml +79 -0
- data/lib/rawbotz/views/orders/index.haml +40 -0
- data/lib/rawbotz/views/orders/menu.haml +24 -0
- data/lib/rawbotz/views/orders/non_remotes.haml +8 -0
- data/lib/rawbotz/views/product/_stock_sales_plot.haml +60 -0
- data/lib/rawbotz/views/product/link_to.haml +29 -0
- data/lib/rawbotz/views/product/view.haml +64 -0
- data/lib/rawbotz/views/products/_link_table.haml +38 -0
- data/lib/rawbotz/views/products/index.haml +36 -0
- data/lib/rawbotz/views/products/link_wizard.haml +48 -0
- data/lib/rawbotz/views/products/links.haml +65 -0
- data/lib/rawbotz/views/products/menu.haml +27 -0
- data/lib/rawbotz/views/products/table.haml +20 -0
- data/lib/rawbotz/views/products/table_with_linking.haml +30 -0
- data/lib/rawbotz/views/remote_cart/index.haml +30 -0
- data/lib/rawbotz/views/remote_order/view.haml +35 -0
- data/lib/rawbotz/views/remote_orders/index.haml +20 -0
- data/lib/rawbotz/views/remote_product/view.haml +90 -0
- data/lib/rawbotz/views/remote_products/_table.haml +15 -0
- data/lib/rawbotz/views/remote_products/index.haml +30 -0
- data/lib/rawbotz/views/supplier/view.haml +63 -0
- data/lib/rawbotz/views/suppliers/index.haml +13 -0
- data/lib/rawbotz/views/thin_layout.haml +32 -0
- data/lib/rawbotz/views/widgets/_ajax_link.haml +5 -0
- data/lib/rawbotz/views/widgets/_link.haml +6 -0
- data/lib/rawbotz/views/widgets/_link_line.haml +15 -0
- data/lib/rawbotz.rb +77 -0
- data/rawbotz.gemspec +33 -0
- metadata +327 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
$(document).ready(function() {
|
2
|
+
// Remote Product Search with single input on page
|
3
|
+
$("input#search-remote").autocomplete({
|
4
|
+
source: function(request, response) {
|
5
|
+
$.ajax({
|
6
|
+
type: "POST",
|
7
|
+
url: "/remote_products/search",
|
8
|
+
data: "term=" + $("input#search-remote").val(),
|
9
|
+
success: function(data) {
|
10
|
+
var parsed = JSON.parse(data);
|
11
|
+
response(parsed);
|
12
|
+
}
|
13
|
+
});
|
14
|
+
},
|
15
|
+
minLength: 1,
|
16
|
+
select: function(event, ui) {
|
17
|
+
$("input#remote_product_id").val(ui.item.product_id);
|
18
|
+
$("input#search-remote").val(ui.item.name);
|
19
|
+
$("input#search-remote").text(ui.item.name);
|
20
|
+
$("#message").text(ui.item.name + " " + ui.item.product_id);
|
21
|
+
return false;
|
22
|
+
},
|
23
|
+
open: function() {
|
24
|
+
$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
|
25
|
+
},
|
26
|
+
close: function() {
|
27
|
+
$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
|
28
|
+
}
|
29
|
+
}).autocomplete("instance")._renderItem = function(ul, item) {
|
30
|
+
return $("<li>").append(item.name).appendTo(ul);
|
31
|
+
};
|
32
|
+
|
33
|
+
// For Non-Remote Order Forms: add a pack
|
34
|
+
$("button.plus-pack").click(function(e) {
|
35
|
+
e.preventDefault();
|
36
|
+
inputField = $(this).siblings("input");
|
37
|
+
current = parseInt(inputField.val());
|
38
|
+
if (isNaN(current)) {
|
39
|
+
current = 0;
|
40
|
+
}
|
41
|
+
packsize = parseInt($(this).data("packsize"));
|
42
|
+
if (isNaN(packsize)) {
|
43
|
+
packsize = 0;
|
44
|
+
}
|
45
|
+
inputField.val(current + packsize);
|
46
|
+
return false;
|
47
|
+
});
|
48
|
+
|
49
|
+
// For Non-Remote Order Forms: subtract a pack
|
50
|
+
$("button.minus-pack").click(function(e) {
|
51
|
+
e.preventDefault();
|
52
|
+
inputField = $(this).siblings("input");
|
53
|
+
current = parseInt(inputField.val());
|
54
|
+
if (isNaN(current)) {
|
55
|
+
current = 0;
|
56
|
+
}
|
57
|
+
packsize = parseInt($(this).data("packsize"));
|
58
|
+
if (isNaN(packsize)) {
|
59
|
+
packsize = 0;
|
60
|
+
}
|
61
|
+
if (current - packsize < 0) {
|
62
|
+
inputField.val(0);
|
63
|
+
} else {
|
64
|
+
inputField.val(current - packsize);
|
65
|
+
}
|
66
|
+
return false;
|
67
|
+
});
|
68
|
+
|
69
|
+
// For Non-Remote Order Forms: empty field
|
70
|
+
$("button.order-none").click(function(e) {
|
71
|
+
e.preventDefault();
|
72
|
+
inputField = $(this).siblings("input");
|
73
|
+
inputField.val(0);
|
74
|
+
return false;
|
75
|
+
});
|
76
|
+
|
77
|
+
// Stock / sales popup
|
78
|
+
$('a.stock_show_action').on('click', function (e) {
|
79
|
+
e.preventDefault();
|
80
|
+
var url = $(e.target).data('url');
|
81
|
+
var product_name = $(e.target).data('product');
|
82
|
+
$('#modal-plot').dialog({
|
83
|
+
resizable: false,
|
84
|
+
autoOpen: false,
|
85
|
+
height: 580,
|
86
|
+
width: 950,
|
87
|
+
show: 'fold',
|
88
|
+
title: 'Stock and sales values of ' + product_name,
|
89
|
+
modal: true
|
90
|
+
});
|
91
|
+
// move up and autoopen
|
92
|
+
$('#modal-plot').load(url);
|
93
|
+
$('#modal-plot').dialog("open");
|
94
|
+
});
|
95
|
+
});
|
96
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
// Source for remote product search by name
|
2
|
+
function acSource(request, response) {
|
3
|
+
$.ajax({
|
4
|
+
type: "POST",
|
5
|
+
url: "/remote_products/search",
|
6
|
+
data: "term=" + request.term,
|
7
|
+
success: function(data) {
|
8
|
+
var parsed = JSON.parse(data);
|
9
|
+
response(parsed);
|
10
|
+
}
|
11
|
+
});
|
12
|
+
}
|
13
|
+
|
14
|
+
// All search-remote-ajax inputs should autocomplete from remote product search
|
15
|
+
function installAutocompletion(jQuery) {
|
16
|
+
$("input.search-remote-ajax").each( function() {
|
17
|
+
field = $(this);
|
18
|
+
field.autocomplete({
|
19
|
+
source: acSource,
|
20
|
+
minLength: 2,
|
21
|
+
open: function() {
|
22
|
+
$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
|
23
|
+
},
|
24
|
+
close: function() {
|
25
|
+
$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
|
26
|
+
},
|
27
|
+
select: function(event, ui) {
|
28
|
+
$(this).val(ui.item.name);
|
29
|
+
$(this).parent().children("input.remote_product_id").val(ui.item.product_id);
|
30
|
+
return false;
|
31
|
+
},
|
32
|
+
}).autocomplete("instance")._renderItem = function(ul, item) {
|
33
|
+
return $("<li>").append(item.name).appendTo(ul);
|
34
|
+
};
|
35
|
+
});
|
36
|
+
}
|
37
|
+
|
38
|
+
// Links in link widget should link
|
39
|
+
function installAjaxLinkAction(jQuery) {
|
40
|
+
$(".ajax_product_link").click(function(e){
|
41
|
+
local_product_id = $(this).parent().parent().parent().children("input.local_product_id").val();
|
42
|
+
input = $(this).parent().children("input.remote_product_id");
|
43
|
+
|
44
|
+
remote_product_id = input.val();
|
45
|
+
$.ajax({
|
46
|
+
type: "POST",
|
47
|
+
url: "/product/" + local_product_id + "/link",
|
48
|
+
data: "remote_product_id=" + remote_product_id,
|
49
|
+
success: function(data) {
|
50
|
+
input.parent().parent().html(data);
|
51
|
+
},
|
52
|
+
error: function(data) {
|
53
|
+
console.log(data);
|
54
|
+
input.parent().parent().html("!" + data);
|
55
|
+
}
|
56
|
+
});
|
57
|
+
|
58
|
+
e.preventDefault();
|
59
|
+
return false;
|
60
|
+
});
|
61
|
+
}
|
62
|
+
|
63
|
+
$(document).ready(installAutocompletion);
|
64
|
+
$(document).ready(installAjaxLinkAction);
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'magento_remote'
|
2
|
+
|
3
|
+
module Rawbotz
|
4
|
+
def self.mech
|
5
|
+
settings = (YAML.load_file Rawbotz.conf_file_path)["remote_shop"]
|
6
|
+
mech = MagentoMech.new settings["base_uri"]
|
7
|
+
mech.pass = settings["pass"]
|
8
|
+
mech.user = settings["user"]
|
9
|
+
mech.login
|
10
|
+
mech
|
11
|
+
end
|
12
|
+
def self.attribute_ids
|
13
|
+
@@attribute_ids ||= (YAML.load_file Rawbotz.conf_file_path)["attribute_ids"]
|
14
|
+
end
|
15
|
+
module RemoteShop
|
16
|
+
def self.product_page_url(product, settings)
|
17
|
+
# settings could be memoized
|
18
|
+
"#{settings['remote_shop']['base_uri']}catalog/product/view/id/#{product.product_id}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::NonRemoteOrders
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
# app.get '/orders/non_remote', &show_suppliers_orders
|
8
|
+
show_suppliers_orders = lambda do
|
9
|
+
haml "orders/non_remotes".to_sym
|
10
|
+
end
|
11
|
+
|
12
|
+
# app.get '/order/non_remote/:supplier_id', &show_supplier_order
|
13
|
+
show_supplier_order = lambda do
|
14
|
+
@supplier = Supplier.find(params[:supplier_id])
|
15
|
+
if @supplier.order_template.to_s == ""
|
16
|
+
add_flash :warning, "You need to set the mailer template to order from this supplier"
|
17
|
+
redirect "/supplier/#{@supplier.id}"
|
18
|
+
else
|
19
|
+
@products = LocalProduct.supplied_by(@supplier)
|
20
|
+
haml "order/non_remote".to_sym
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# app.post '/order/non_remote/:supplier_id', &show_supplier_order_preview
|
25
|
+
show_supplier_order_preview = lambda do
|
26
|
+
@supplier = Supplier.find(params[:supplier_id])
|
27
|
+
@products = @supplier.local_products
|
28
|
+
|
29
|
+
order = {supplier: @supplier, order_items: []}
|
30
|
+
params.select{|p| p.start_with?("item_")}.each do |p, val|
|
31
|
+
if val && val.to_i > 0
|
32
|
+
qty = val.to_i
|
33
|
+
product = LocalProduct.find(p[5..-1])
|
34
|
+
order[:order_items] << {num_wished: qty, local_product: product}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
@mail_preview = Rawbotz::MailTemplate.consume @supplier.order_template, order
|
38
|
+
haml "order/non_remote".to_sym
|
39
|
+
end
|
40
|
+
|
41
|
+
app.get '/orders/non_remote', &show_suppliers_orders
|
42
|
+
app.get '/order/non_remote/:supplier_id', &show_supplier_order
|
43
|
+
app.post '/order/non_remote/:supplier_id', &show_supplier_order_preview
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::Orders
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
# app.get '/orders', &show_orders
|
8
|
+
show_orders = lambda do
|
9
|
+
@orders = Order.where("supplier_id IS NULL OR supplier_id = %d" % settings.supplier.id).order(created_at: :desc)
|
10
|
+
haml "orders/index".to_sym
|
11
|
+
end
|
12
|
+
|
13
|
+
# app.get '/order/new', &create_order
|
14
|
+
create_order = lambda do
|
15
|
+
if Order.current.present?
|
16
|
+
add_flash :message, "Already one Order in progress"
|
17
|
+
@order = Order.current
|
18
|
+
else
|
19
|
+
@order = Order.create(state: :new)
|
20
|
+
@order.supplier = settings.supplier
|
21
|
+
|
22
|
+
RawgentoDB::Query.understocked.each do |product_id, name, min_qty, stock|
|
23
|
+
local_product = LocalProduct.find_by(product_id: product_id)
|
24
|
+
if local_product.present? && local_product.supplier == settings.supplier
|
25
|
+
@order.order_items.create(local_product: local_product,
|
26
|
+
current_stock: stock,
|
27
|
+
min_stock: min_qty)
|
28
|
+
end
|
29
|
+
# else none of our business
|
30
|
+
end
|
31
|
+
@order.save
|
32
|
+
add_flash :success, "New Order created"
|
33
|
+
end
|
34
|
+
redirect "/order/#{@order.id}"
|
35
|
+
end
|
36
|
+
|
37
|
+
# app.get '/order/:id', &show_order
|
38
|
+
show_order = lambda do
|
39
|
+
@order = Order.find(params[:id])
|
40
|
+
haml 'order/view'.to_sym
|
41
|
+
end
|
42
|
+
|
43
|
+
# app.post '/order/:id/', &act_on_order
|
44
|
+
act_on_order = lambda do
|
45
|
+
@order = Order.find(params[:id])
|
46
|
+
params.each do |k,v|
|
47
|
+
if k && k.start_with?("item_") && v != ""
|
48
|
+
OrderItem.find(k[5..-1]).update(num_wished: v.to_i)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
if params['action'] == 'order'
|
52
|
+
@order.update(state: :queued)
|
53
|
+
add_flash :success, 'Order queued'
|
54
|
+
redirect '/orders'
|
55
|
+
elsif params['action'] == 'delete'
|
56
|
+
@order.update(state: :deleted)
|
57
|
+
add_flash :success, 'Order marked deleted'
|
58
|
+
redirect '/orders'
|
59
|
+
else
|
60
|
+
haml "order/view".to_sym
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# app.get '/order/:id/packlist', &show_order_packlist
|
65
|
+
show_order_packlist = lambda do
|
66
|
+
@order = Order.find(params[:id])
|
67
|
+
haml "order/packlist".to_sym
|
68
|
+
end
|
69
|
+
|
70
|
+
app.get '/orders', &show_orders
|
71
|
+
app.get '/order/new', &create_order
|
72
|
+
app.get '/order/:id', &show_order
|
73
|
+
app.post '/order/:id', &act_on_order
|
74
|
+
app.get '/order/:id/packlist', &show_order_packlist
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::ProductLinks
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
|
8
|
+
# app.get '/products/links', &show_products_links
|
9
|
+
show_products_links = lambda do
|
10
|
+
@local_products = LocalProduct.supplied_by(settings.supplier)
|
11
|
+
@remote_products = RemoteProduct.supplied_by(settings.supplier)
|
12
|
+
haml "products/links".to_sym
|
13
|
+
end
|
14
|
+
|
15
|
+
# app.get '/products/link_wizard', &show_link_wizard
|
16
|
+
show_link_wizard = lambda do
|
17
|
+
@unlinked_count = settings.supplier.local_products.unlinked.count
|
18
|
+
@local_product = settings.supplier.local_products.unlinked.first
|
19
|
+
params[:idx] = 0
|
20
|
+
haml "products/link_wizard".to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
# app.get '/products/link_wizard/:idx', &show_link_wizard_id
|
24
|
+
show_link_wizard_id = lambda do
|
25
|
+
@unlinked_count = LocalProduct.unlinked.count
|
26
|
+
@local_product = LocalProduct.supplied_by(settings.supplier).unlinked.at(params[:idx].to_i || 0)
|
27
|
+
haml "products/link_wizard".to_sym
|
28
|
+
end
|
29
|
+
|
30
|
+
# app.get '/product/:id/link', &link_product_view
|
31
|
+
link_product_view = lambda do
|
32
|
+
@product = RawgentoModels::LocalProduct.find(params[:id])
|
33
|
+
@remote_products = RawgentoModels::RemoteProduct
|
34
|
+
haml 'product/link_to'.to_sym
|
35
|
+
end
|
36
|
+
|
37
|
+
# app.post '/product/:id/link', &link_product
|
38
|
+
link_product = lambda do
|
39
|
+
remote_product = RemoteProduct.find(params[:remote_product_id])
|
40
|
+
@product = RawgentoModels::LocalProduct.find(params[:id])
|
41
|
+
@product.remote_product = remote_product
|
42
|
+
@product.save
|
43
|
+
|
44
|
+
if request.xhr?
|
45
|
+
remote_product_link remote_product
|
46
|
+
else
|
47
|
+
add_flash :success, "Linked Product '#{@product.name}' to '#{@product.remote_product.name}'"
|
48
|
+
|
49
|
+
if params[:redirect_to] == "link_wizard"
|
50
|
+
redirect '/products/link_wizard'
|
51
|
+
elsif params[:redirect_to] == "links"
|
52
|
+
redirect "/products/links"
|
53
|
+
elsif params[:redirect_to]
|
54
|
+
redirect "/products/links"
|
55
|
+
else
|
56
|
+
redirect "/product/#{params[:id]}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
app.get '/products/links', &show_products_links
|
62
|
+
app.get '/products/link_wizard', &show_link_wizard
|
63
|
+
app.get '/products/link_wizard/:idx', &show_link_wizard_id
|
64
|
+
|
65
|
+
app.get '/product/:id/link', &link_product_view
|
66
|
+
app.post '/product/:id/link', &link_product
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::Products
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
# app.get '/products', &show_products
|
8
|
+
show_products = lambda do
|
9
|
+
@products = LocalProduct
|
10
|
+
@suppliers = Supplier.all
|
11
|
+
haml "products/index".to_sym
|
12
|
+
end
|
13
|
+
|
14
|
+
# app.post '/products/search', &search_products
|
15
|
+
search_products = lambda do
|
16
|
+
@products = LocalProduct
|
17
|
+
.where('lower(name) LIKE ?', "%#{params[:term].downcase}%").limit(20).pluck(:name, :id)
|
18
|
+
@products.map{|p| {name: p[0], product_id: p[1]}}.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
# app.get '/product/:id', &show_product
|
22
|
+
show_product = lambda do
|
23
|
+
settings = RawgentoDB.settings(Rawbotz.conf_file_path)
|
24
|
+
@product = LocalProduct.unscoped.find(params[:id])
|
25
|
+
begin
|
26
|
+
@sales = RawgentoDB::Query.sales_daily_between(@product.product_id,
|
27
|
+
Date.today,
|
28
|
+
Date.today - 30,
|
29
|
+
settings)
|
30
|
+
rescue
|
31
|
+
@sales = []
|
32
|
+
add_flash :error, 'Cannot connect to MySQL database'
|
33
|
+
end
|
34
|
+
@plot_data = Rawbotz::Datapolate.create_data @sales, @product.stock_items.where(created_at: (Date.today - 30)..Date.today)
|
35
|
+
haml "product/view".to_sym
|
36
|
+
end
|
37
|
+
|
38
|
+
# app.get '/product/:id/stock_sales_plot', &show_product
|
39
|
+
show_product_stock_sales_plot = lambda do
|
40
|
+
@product = LocalProduct.unscoped.find(params[:id])
|
41
|
+
begin
|
42
|
+
@sales = RawgentoDB::Query.sales_daily_between(@product.product_id,
|
43
|
+
Date.today,
|
44
|
+
Date.today - 30,
|
45
|
+
RawgentoDB.settings(Rawbotz.conf_file_path))
|
46
|
+
rescue
|
47
|
+
@sales = []
|
48
|
+
add_flash :error, 'Cannot connect to MySQL database'
|
49
|
+
end
|
50
|
+
@plot_data = Rawbotz::Datapolate.create_data @sales, @product.stock_items
|
51
|
+
haml "product/_stock_sales_plot".to_sym, layout: :thin_layout, locals: {plot_data: @plot_data}
|
52
|
+
end
|
53
|
+
|
54
|
+
# app.post '/product/:id/hide', &hide_product
|
55
|
+
hide_product = lambda do
|
56
|
+
@product = RawgentoModels::LocalProduct.find(params[:id])
|
57
|
+
@product.active = false
|
58
|
+
@product.save
|
59
|
+
|
60
|
+
add_flash :success, "Product '#{@product.name}' is now hidden"
|
61
|
+
redirect back
|
62
|
+
end
|
63
|
+
|
64
|
+
# app.post '/product/:id/unhide', &unhide_product
|
65
|
+
unhide_product = lambda do
|
66
|
+
@product = RawgentoModels::LocalProduct.unscoped.find(params[:id])
|
67
|
+
@product.active = true
|
68
|
+
@product.save
|
69
|
+
|
70
|
+
add_flash :success, "Product '#{@product.name}' is now not hidden anymore"
|
71
|
+
redirect back
|
72
|
+
end
|
73
|
+
|
74
|
+
# app.get '/remote_products', &show_remote_products
|
75
|
+
show_remote_products = lambda do
|
76
|
+
@products = RawgentoModels::RemoteProduct.all
|
77
|
+
haml "remote_products/index".to_sym
|
78
|
+
end
|
79
|
+
|
80
|
+
# app.post '/remote_products/search', &search_remote_products
|
81
|
+
search_remote_products = lambda do
|
82
|
+
@products = RemoteProduct.supplied_by(settings.supplier)
|
83
|
+
.where('lower(name) LIKE ?', "%#{params[:term].downcase}%").limit(20).pluck(:name, :id)
|
84
|
+
@products.map{|p| {name: p[0], product_id: p[1]}}.to_json
|
85
|
+
end
|
86
|
+
|
87
|
+
# app.get '/remote_product/id', &show_remote_product
|
88
|
+
show_remote_product = lambda do
|
89
|
+
@product = RawgentoModels::RemoteProduct.find(params[:id])
|
90
|
+
haml "remote_product/view".to_sym
|
91
|
+
end
|
92
|
+
|
93
|
+
app.get '/products', &show_products
|
94
|
+
app.post '/products/search', &search_products
|
95
|
+
app.get '/product/:id', &show_product
|
96
|
+
app.get '/product/:id/stock_sales_plot', &show_product_stock_sales_plot
|
97
|
+
app.post '/product/:id/hide', &hide_product
|
98
|
+
app.post '/product/:id/unhide', &unhide_product
|
99
|
+
|
100
|
+
app.get '/remote_products', &show_remote_products
|
101
|
+
app.post '/remote_products/search', &search_remote_products
|
102
|
+
app.get '/remote_product/id', &show_remote_product
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::RemoteShop
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
# app.get '/remote_cart', &show_remote_cart
|
8
|
+
show_remote_cart = lambda do
|
9
|
+
@cart_content = Rawbotz.mech.get_cart_content
|
10
|
+
@cart_products = @cart_content.map do |name, qty|
|
11
|
+
[RemoteProduct.find_by(name: name), qty]
|
12
|
+
end
|
13
|
+
haml "remote_cart/index".to_sym
|
14
|
+
end
|
15
|
+
|
16
|
+
# app.get '/remote_orders', &show_remote_orders
|
17
|
+
show_remote_orders = lambda do
|
18
|
+
@last_orders = Rawbotz.mech.last_orders
|
19
|
+
haml "remote_orders/index".to_sym
|
20
|
+
end
|
21
|
+
|
22
|
+
# app.get '/remote_order/:id', &show_remote_order
|
23
|
+
show_remote_order = lambda do
|
24
|
+
@remote_order_id = params[:id]
|
25
|
+
@remote_order_items = Rawbotz.mech.products_from_order params[:id]
|
26
|
+
@remote_products_qty = @remote_order_items.map do |remote_product|
|
27
|
+
[RemoteProduct.find_by(name: remote_product[0]) || OpenStruct.new(name: remote_product[0]), remote_product[2]]
|
28
|
+
end
|
29
|
+
# TODO catch problem if one is missing ...
|
30
|
+
haml "remote_order/view".to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
app.get '/remote_cart', &show_remote_cart
|
34
|
+
app.get '/remote_orders', &show_remote_orders
|
35
|
+
app.get '/remote_order/:id', &show_remote_order
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rawbotz/routes'
|
2
|
+
|
3
|
+
module Rawbotz::RawbotzApp::Routing::Suppliers
|
4
|
+
include RawgentoModels
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
# app.get '/suppliers', &show_suppliers
|
8
|
+
show_suppliers = lambda do
|
9
|
+
@suppliers = Supplier.all
|
10
|
+
haml "suppliers/index".to_sym
|
11
|
+
end
|
12
|
+
|
13
|
+
# app.get '/supplier/:id', &show_supplier
|
14
|
+
show_supplier = lambda do
|
15
|
+
@supplier = Supplier.find(params[:id])
|
16
|
+
haml "supplier/view".to_sym
|
17
|
+
end
|
18
|
+
|
19
|
+
# app.post '/supplier/:id', &update_supplier
|
20
|
+
update_supplier = lambda do
|
21
|
+
@supplier = Supplier.find(params[:id])
|
22
|
+
@supplier.email = params[:email]
|
23
|
+
@supplier.order_template = params[:order_template]
|
24
|
+
if @supplier.save
|
25
|
+
add_flash :success, "Supplier updated"
|
26
|
+
else
|
27
|
+
add_flash :error, "Supplier could not be saved"
|
28
|
+
end
|
29
|
+
haml "supplier/view".to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
app.get '/suppliers', &show_suppliers
|
33
|
+
app.get '/supplier/:id', &show_supplier
|
34
|
+
app.post '/supplier/:id', &update_supplier
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# define Rawbotz::RawbotzApp::Routing
|
2
|
+
module Rawbotz; module RawbotzApp ; module Routing ; end ; end ; end
|
3
|
+
|
4
|
+
require 'rawbotz/routes/product_links'
|
5
|
+
require 'rawbotz/routes/products'
|
6
|
+
require 'rawbotz/routes/orders'
|
7
|
+
require 'rawbotz/routes/remote_shop'
|
8
|
+
require 'rawbotz/routes/suppliers'
|
9
|
+
require 'rawbotz/routes/non_remote_orders'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
- if product.active?
|
2
|
+
%form.pure-form.pure-form-aligned(action="/product/#{product.id}/hide" method="post")
|
3
|
+
%button.pure-button.pure-button-primary(type="submit")
|
4
|
+
%i.fa.fa-ban
|
5
|
+
Hide
|
6
|
+
- else
|
7
|
+
%form.pure-form.pure-form-aligned(action="/product/#{product.id}/unhide" method="post")
|
8
|
+
%button.pure-button.pure-button-primary(type="submit")
|
9
|
+
%i.fa.fa-eye
|
10
|
+
Unhide
|
11
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
.pure-menu.pure-menu-horizontal#menu
|
2
|
+
%center
|
3
|
+
%ul.pure-menu-list
|
4
|
+
%li.pure-menu-item
|
5
|
+
%a.pure-menu-link(href="/orders")
|
6
|
+
= order_icon
|
7
|
+
Orders
|
8
|
+
%li.pure-menu-item
|
9
|
+
%a.pure-menu-link(href="/products")
|
10
|
+
= products_icon
|
11
|
+
Products
|
12
|
+
%li.pure-menu-item
|
13
|
+
%a.pure-menu-link(href="/remote_cart")
|
14
|
+
%i(class="fa fa-cart-arrow-down")
|
15
|
+
Current Cart
|
16
|
+
%li.pure-menu-item
|
17
|
+
%a.pure-menu-link(href="/maintenance")
|
18
|
+
= settings_icon
|
19
|
+
Maintenance
|
20
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
%h1 Welcome at Rawbotz
|
@@ -0,0 +1,55 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Rawbotz
|
5
|
+
%meta(name="viewport" content="width=device-width, initial-scale=1")
|
6
|
+
%meta(charset="utf-8")
|
7
|
+
%link(rel="stylesheet" txpe="text/css" href="/pure-min.css")
|
8
|
+
%link(rel="stylesheet" txpe="text/css" href="/font-awesome-4.5.0/css/font-awesome.min.css")
|
9
|
+
%link(rel="stylesheet" txpe="text/css" href="/rawbotz.css")
|
10
|
+
%script{:type => 'text/javascript', :src => "/Chart.min.js"}
|
11
|
+
%script{:type => 'text/javascript', :src => "/jquery-2.2.0.min.js"}
|
12
|
+
%script{:type => 'text/javascript', :src => "/jui/jquery-ui.min.js"}
|
13
|
+
%link(rel="stylesheet" type='text/css' href="/jui/jquery-ui.min.css")
|
14
|
+
%script{:type => 'text/javascript', :src => "/rawbotz.js"}
|
15
|
+
%script{:type => 'text/javascript', :src => "/rawbotz_link_line.js"}
|
16
|
+
%script{:type => 'text/javascript', :src => "/rawbotz_ajax_product_link.js"}
|
17
|
+
%body
|
18
|
+
.pure-g
|
19
|
+
.pure-u-1
|
20
|
+
= haml "_menu".to_sym
|
21
|
+
.pure-u-1#main
|
22
|
+
- if flash
|
23
|
+
- if msg = flash.delete(:error)
|
24
|
+
#flash.ui-state-error
|
25
|
+
= error_icon
|
26
|
+
= msg.join(" | ")
|
27
|
+
- if msg = flash.delete(:success)
|
28
|
+
#flash.ui-state-highlight
|
29
|
+
= success_icon
|
30
|
+
= msg.join(" | ")
|
31
|
+
- if msg = flash.delete(:failure)
|
32
|
+
#flash.ui-state-highlight
|
33
|
+
= error_icon
|
34
|
+
= msg.join(" | ")
|
35
|
+
- if msg = flash.delete(:info)
|
36
|
+
#flash.ui-state-highlight
|
37
|
+
= info_icon
|
38
|
+
= msg.join(" | ")
|
39
|
+
-# Consume the remainder
|
40
|
+
- if flash.length > 0
|
41
|
+
= flash.inspect
|
42
|
+
#flash.ui-state-highlight
|
43
|
+
- flash.each do |f|
|
44
|
+
= error_icon
|
45
|
+
= flash.delete(f[0]).join(" | ")
|
46
|
+
|
47
|
+
=yield
|
48
|
+
%br
|
49
|
+
.pure-u-1
|
50
|
+
.pure-menu.pure-menu-horizontal#menu
|
51
|
+
%small
|
52
|
+
%center
|
53
|
+
%ul.pure-menu-list
|
54
|
+
%li.pure-menu-item
|
55
|
+
Rawbotz 2016 (c) Felix Wolfsteller
|