rawbotz 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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