rawbotz 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/CODE_OF_CONDUCT.md +49 -0
  4. data/Gemfile +9 -0
  5. data/README.md +185 -0
  6. data/Rakefile +29 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/config.ru +9 -0
  10. data/exe/debug/test_mail +15 -0
  11. data/exe/rawbotz +39 -0
  12. data/exe/rawbotz_import_links +74 -0
  13. data/exe/rawbotz_maintenance.sh +57 -0
  14. data/exe/rawbotz_process_order +86 -0
  15. data/exe/rawbotz_process_order_queue +80 -0
  16. data/exe/rawbotz_stock_update +84 -0
  17. data/exe/rawbotz_update_local_products +48 -0
  18. data/exe/rawbotz_update_remote_products +160 -0
  19. data/lib/rawbotz/app.rb +84 -0
  20. data/lib/rawbotz/cli/order_result_table.rb +57 -0
  21. data/lib/rawbotz/datapolate.rb +42 -0
  22. data/lib/rawbotz/helpers/flash_helper.rb +13 -0
  23. data/lib/rawbotz/helpers/icon_helper.rb +40 -0
  24. data/lib/rawbotz/helpers/resource_link_helper.rb +45 -0
  25. data/lib/rawbotz/local_shop.rb +12 -0
  26. data/lib/rawbotz/mail_template.rb +29 -0
  27. data/lib/rawbotz/option_parser.rb +37 -0
  28. data/lib/rawbotz/order_processor.rb +92 -0
  29. data/lib/rawbotz/product_updater.rb +89 -0
  30. data/lib/rawbotz/public/Chart.min.js +14 -0
  31. data/lib/rawbotz/public/font-awesome-4.5.0/HELP-US-OUT.txt +7 -0
  32. data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.css +2086 -0
  33. data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.min.css +4 -0
  34. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/FontAwesome.otf +0 -0
  35. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.eot +0 -0
  36. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.svg +655 -0
  37. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf +0 -0
  38. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff +0 -0
  39. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 +0 -0
  40. data/lib/rawbotz/public/font-awesome-4.5.0/less/animated.less +34 -0
  41. data/lib/rawbotz/public/font-awesome-4.5.0/less/bordered-pulled.less +25 -0
  42. data/lib/rawbotz/public/font-awesome-4.5.0/less/core.less +12 -0
  43. data/lib/rawbotz/public/font-awesome-4.5.0/less/fixed-width.less +6 -0
  44. data/lib/rawbotz/public/font-awesome-4.5.0/less/font-awesome.less +17 -0
  45. data/lib/rawbotz/public/font-awesome-4.5.0/less/icons.less +697 -0
  46. data/lib/rawbotz/public/font-awesome-4.5.0/less/larger.less +13 -0
  47. data/lib/rawbotz/public/font-awesome-4.5.0/less/list.less +19 -0
  48. data/lib/rawbotz/public/font-awesome-4.5.0/less/mixins.less +26 -0
  49. data/lib/rawbotz/public/font-awesome-4.5.0/less/path.less +15 -0
  50. data/lib/rawbotz/public/font-awesome-4.5.0/less/rotated-flipped.less +20 -0
  51. data/lib/rawbotz/public/font-awesome-4.5.0/less/stacked.less +20 -0
  52. data/lib/rawbotz/public/font-awesome-4.5.0/less/variables.less +708 -0
  53. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_animated.scss +34 -0
  54. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_bordered-pulled.scss +25 -0
  55. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_core.scss +12 -0
  56. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_fixed-width.scss +6 -0
  57. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_icons.scss +697 -0
  58. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_larger.scss +13 -0
  59. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_list.scss +19 -0
  60. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_mixins.scss +26 -0
  61. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_path.scss +15 -0
  62. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_rotated-flipped.scss +20 -0
  63. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_stacked.scss +20 -0
  64. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_variables.scss +708 -0
  65. data/lib/rawbotz/public/font-awesome-4.5.0/scss/font-awesome.scss +17 -0
  66. data/lib/rawbotz/public/jquery-2.2.0.min.js +4 -0
  67. data/lib/rawbotz/public/jui/external/jquery/jquery.js +9789 -0
  68. data/lib/rawbotz/public/jui/images/ui-icons_444444_256x240.png +0 -0
  69. data/lib/rawbotz/public/jui/images/ui-icons_555555_256x240.png +0 -0
  70. data/lib/rawbotz/public/jui/images/ui-icons_777620_256x240.png +0 -0
  71. data/lib/rawbotz/public/jui/images/ui-icons_777777_256x240.png +0 -0
  72. data/lib/rawbotz/public/jui/images/ui-icons_cc0000_256x240.png +0 -0
  73. data/lib/rawbotz/public/jui/images/ui-icons_ffffff_256x240.png +0 -0
  74. data/lib/rawbotz/public/jui/index.html +513 -0
  75. data/lib/rawbotz/public/jui/jquery-ui.css +1225 -0
  76. data/lib/rawbotz/public/jui/jquery-ui.js +16617 -0
  77. data/lib/rawbotz/public/jui/jquery-ui.min.css +7 -0
  78. data/lib/rawbotz/public/jui/jquery-ui.min.js +13 -0
  79. data/lib/rawbotz/public/jui/jquery-ui.structure.css +833 -0
  80. data/lib/rawbotz/public/jui/jquery-ui.structure.min.css +5 -0
  81. data/lib/rawbotz/public/jui/jquery-ui.theme.css +410 -0
  82. data/lib/rawbotz/public/jui/jquery-ui.theme.min.css +5 -0
  83. data/lib/rawbotz/public/pure-min.css +11 -0
  84. data/lib/rawbotz/public/rawbotz.css +60 -0
  85. data/lib/rawbotz/public/rawbotz.js +96 -0
  86. data/lib/rawbotz/public/rawbotz_ajax_product_link.js +64 -0
  87. data/lib/rawbotz/remote_shop.rb +21 -0
  88. data/lib/rawbotz/routes/non_remote_orders.rb +45 -0
  89. data/lib/rawbotz/routes/orders.rb +76 -0
  90. data/lib/rawbotz/routes/product_links.rb +68 -0
  91. data/lib/rawbotz/routes/products.rb +104 -0
  92. data/lib/rawbotz/routes/remote_shop.rb +37 -0
  93. data/lib/rawbotz/routes/suppliers.rb +36 -0
  94. data/lib/rawbotz/routes.rb +9 -0
  95. data/lib/rawbotz/version.rb +3 -0
  96. data/lib/rawbotz/views/_hide_unhide_button.haml +11 -0
  97. data/lib/rawbotz/views/_menu.haml +20 -0
  98. data/lib/rawbotz/views/index.haml +1 -0
  99. data/lib/rawbotz/views/layout.haml +55 -0
  100. data/lib/rawbotz/views/maintenance/menu.haml +25 -0
  101. data/lib/rawbotz/views/maintenance.haml +150 -0
  102. data/lib/rawbotz/views/order/_head.haml +24 -0
  103. data/lib/rawbotz/views/order/_item_table.haml +44 -0
  104. data/lib/rawbotz/views/order/new.haml +22 -0
  105. data/lib/rawbotz/views/order/non_remote.haml +42 -0
  106. data/lib/rawbotz/views/order/packlist.haml +14 -0
  107. data/lib/rawbotz/views/order/view.haml +79 -0
  108. data/lib/rawbotz/views/orders/index.haml +40 -0
  109. data/lib/rawbotz/views/orders/menu.haml +24 -0
  110. data/lib/rawbotz/views/orders/non_remotes.haml +8 -0
  111. data/lib/rawbotz/views/product/_stock_sales_plot.haml +60 -0
  112. data/lib/rawbotz/views/product/link_to.haml +29 -0
  113. data/lib/rawbotz/views/product/view.haml +64 -0
  114. data/lib/rawbotz/views/products/_link_table.haml +38 -0
  115. data/lib/rawbotz/views/products/index.haml +36 -0
  116. data/lib/rawbotz/views/products/link_wizard.haml +48 -0
  117. data/lib/rawbotz/views/products/links.haml +65 -0
  118. data/lib/rawbotz/views/products/menu.haml +27 -0
  119. data/lib/rawbotz/views/products/table.haml +20 -0
  120. data/lib/rawbotz/views/products/table_with_linking.haml +30 -0
  121. data/lib/rawbotz/views/remote_cart/index.haml +30 -0
  122. data/lib/rawbotz/views/remote_order/view.haml +35 -0
  123. data/lib/rawbotz/views/remote_orders/index.haml +20 -0
  124. data/lib/rawbotz/views/remote_product/view.haml +90 -0
  125. data/lib/rawbotz/views/remote_products/_table.haml +15 -0
  126. data/lib/rawbotz/views/remote_products/index.haml +30 -0
  127. data/lib/rawbotz/views/supplier/view.haml +63 -0
  128. data/lib/rawbotz/views/suppliers/index.haml +13 -0
  129. data/lib/rawbotz/views/thin_layout.haml +32 -0
  130. data/lib/rawbotz/views/widgets/_ajax_link.haml +5 -0
  131. data/lib/rawbotz/views/widgets/_link.haml +6 -0
  132. data/lib/rawbotz/views/widgets/_link_line.haml +15 -0
  133. data/lib/rawbotz.rb +77 -0
  134. data/rawbotz.gemspec +33 -0
  135. 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,3 @@
1
+ module Rawbotz
2
+ VERSION = "0.1.2".freeze
3
+ end
@@ -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