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,25 @@
1
+ .icon#headicon
2
+ = settings_icon
3
+
4
+ .pure-u-1
5
+ .pure-menu.pure-menu-horizontal#submenu
6
+ %small
7
+ %center
8
+ %ul.pure-menu-list
9
+ %li.pure-menu-item
10
+ %a.pure-menu-link(href="/maintenance")
11
+ %i(class="fa fa-question")
12
+ Info
13
+ %li.pure-menu-item
14
+ %a.pure-menu-link(href="/products/links")
15
+ = link_icon
16
+ Product Linking
17
+ %li.pure-menu-item
18
+ %a.pure-menu-link(href="/products/link_wizard")
19
+ %i(class="fa fa-magic")
20
+ Link Wizard
21
+ %li.pure-menu-item
22
+ %a.pure-menu-link(href="/suppliers")
23
+ %i(class="fa fa-globe")
24
+ Suppliers
25
+
@@ -0,0 +1,150 @@
1
+ .icon#headicon
2
+ = settings_icon
3
+
4
+ = haml "maintenance/menu".to_sym
5
+
6
+ %h1 Maintenance
7
+
8
+ %h2 Info
9
+
10
+ %h3 Remote Shop
11
+ %center
12
+ %small
13
+ %table.pure-table.settings
14
+ %tr
15
+ %td
16
+ %b Name
17
+ %td
18
+ = settings.supplier_name
19
+ %tr
20
+ %td
21
+ %b URI
22
+ %td
23
+ = settings.conf["remote_shop"]["base_uri"]
24
+ %tr
25
+ %td
26
+ %b Account
27
+ %td
28
+ = settings.conf["remote_shop"]["user"]
29
+
30
+ %h3 Local Shop Database (mysql)
31
+ %center
32
+ %small
33
+ %table.pure-table.settings
34
+ %tr
35
+ %td
36
+ %b Host
37
+ %td
38
+ = settings.conf["host"]
39
+ %tr
40
+ %td
41
+ %b Port
42
+ %td
43
+ = settings.conf["port"]
44
+ %tr
45
+ %td
46
+ %b Name
47
+ %td
48
+ = settings.conf["database"]
49
+
50
+ %h3 Rawbotz Database
51
+ %center
52
+ %small
53
+ %table.pure-table.settings
54
+ %tr
55
+ %td
56
+ %b Path
57
+ %td
58
+ = settings.conf["default"]["database"]
59
+
60
+ %h3 Mail
61
+ %center
62
+ %small
63
+ %table.pure-table.settings
64
+ %tr
65
+ %td
66
+ %b To
67
+ %td
68
+ = settings.conf["mail"]["to"]
69
+ %tr
70
+ %td
71
+ %b From
72
+ %td
73
+ = settings.conf["mail"]["from"]
74
+ %tr
75
+ %td
76
+ %b Host
77
+ %td
78
+ = settings.conf["mail"]["host"]
79
+ %tr
80
+ %td
81
+ %b Port
82
+ %td
83
+ = settings.conf["mail"]["port"]
84
+
85
+ %h2 Actions
86
+ .pure-u-1-5
87
+ .pure-u-3-5
88
+ .pure-menu.pure-menu-horizontal#menu
89
+ %center
90
+ %ul.pure-menu-list
91
+ %li.pure-menu-item
92
+ %a.pure-menu-link(href="/")
93
+ %i(class="fa fa-puzzle-refresh")
94
+ Refresh/Import remote
95
+ %li.pure-menu-item
96
+ %a.pure-menu-link(href="/")
97
+ %i(class="fa fa-import")
98
+ Maintenance...
99
+ %li.pure-menu-item
100
+ %a.pure-menu-link(href="/")
101
+ %i(class="fa fa-import")
102
+ Trigger Order
103
+ .pure-u-1-5
104
+
105
+ %h2 Systems Information
106
+
107
+ Version #{Rawbotz::VERSION}.
108
+
109
+ Built on top of
110
+
111
+ %dl
112
+ %dt
113
+ %a(href="http://sinatrarb.com") Sinatra
114
+ %dd
115
+ Minimal Web Application Framework how it should be done, Ruby.
116
+
117
+ %dt
118
+ %a(href="http://haml.info") Haml
119
+ %dd
120
+ Write less but better HTML.
121
+
122
+ %dt
123
+ %a(href="http://rubyonrails.org") ActiveRecord
124
+ %dd
125
+ Popular ORM from the Ruby on Rails universe
126
+
127
+ %dt
128
+ %a(href="http://purecss.io") Pure CSS framework
129
+ %dd
130
+ Small but solid CSS framework.
131
+
132
+ %dt
133
+ %a(href="https://fortawesome.github.io/Font-Awesome") Font Awesome
134
+ %dd
135
+ (Font) Awesome icons.
136
+
137
+ %dt
138
+ %a(href="http://chartjs.org") Chart.js
139
+ %dd
140
+ For JavaScript Charts.
141
+
142
+ %dt
143
+ %a(href="http://jquery.com") jQuery
144
+ %dd
145
+ For JavaScript.
146
+
147
+ %dt
148
+ %a(href="https://jqueryui.com") jQuery UI
149
+ %dd
150
+ For JavaScript UI goodies.
@@ -0,0 +1,24 @@
1
+ %h2 General
2
+ %dl
3
+ %dt
4
+ Supplier
5
+ %dd
6
+ = order.supplier.try(:name)
7
+ %dt
8
+ Created at
9
+ %dd
10
+ = order.created_at
11
+ %dt
12
+ Updated at
13
+ %dd
14
+ = order.updated_at
15
+ %dt
16
+ State
17
+ %dd
18
+ = order.state
19
+
20
+ %h2 Content
21
+ = order.order_items.count
22
+ Items.
23
+
24
+
@@ -0,0 +1,44 @@
1
+
2
+ %table.pure-table.pure-table-bordered
3
+ %thead
4
+ %tr
5
+ %th Product ID
6
+ %th Product Name
7
+ %th Stock (at time of Order)
8
+ %th Min Stock
9
+ %th Order
10
+ %th Packsize
11
+ %th Stock/Sales history
12
+ %tbody
13
+ - order_items.each do |order_item|
14
+ %tr
15
+ %td
16
+ - if order_item.local_product
17
+ = order_item.local_product.product_id
18
+ - else
19
+ No local product!
20
+ %td
21
+ = local_product_link order_item.local_product
22
+ %td= order_item.current_stock
23
+ %td= order_item.min_stock
24
+ %td
25
+ - if order_item.remote_product_id.present?
26
+ %input.qty(name="item_#{order_item.id}" size="1" value="#{order_item.num_wished}")
27
+ %button.pure-button.order-none
28
+ %i.fa.fa-remove
29
+ - packsize = order_item.local_product.packsize
30
+ - if packsize
31
+ %button.pure-button.plus-pack(data-packsize="#{packsize}")
32
+ %i.fa.fa-plus-square
33
+ %i.fa.fa-cube
34
+ %button.pure-button.minus-pack(data-packsize="#{packsize}")
35
+ %i.fa.fa-minus-square
36
+ %i.fa.fa-cube
37
+ -#(last time X)
38
+ - else
39
+ No remote product
40
+ %td= order_item.local_product.packsize
41
+ %td
42
+ - stock_url = "/product/#{order_item.local_product.id}/stock_sales_plot"
43
+ %a.stock_show_action{:href => "", :data => {url: stock_url, product: order_item.local_product.name}}
44
+ Show Stock/Sale data
@@ -0,0 +1,22 @@
1
+ %h1 New Order
2
+
3
+ %form.pure-form.pure-form-aligned(action="" method="post")
4
+ %input(type="hidden" name="_method" value="put")
5
+
6
+ :javascript
7
+ $(function() {
8
+ $( "#tabs" ).tabs();
9
+ });
10
+
11
+ #tabs
12
+ %ul
13
+ %li
14
+ %a(href="#under_min")Under min
15
+ %li
16
+ %a(href="#tabs-2")all
17
+ %li
18
+ %a(href="#tabs-2")ordered
19
+ %li
20
+ %a(href="#tabs-3")ignored
21
+ #under_min
22
+ = haml "order/_item_table".to_sym, locals: { order: @order}
@@ -0,0 +1,42 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 Non-Remote Order for supplier #{@supplier.name}
4
+
5
+ %center
6
+ %form.pure-form(action="" method="post")
7
+ %input(name="supplier_id" type="hidden" value="#{@supplier.id}")
8
+ %table.pure-table
9
+ %thead
10
+ %tr
11
+ %th Name
12
+ %th Qty
13
+ %th Packsize
14
+ -#%th Stock and Sales
15
+ %tbody
16
+ - @products.find_each do |product|
17
+ %tr
18
+ %td
19
+ = product_link product
20
+ %td
21
+ %input.qty(name="item_#{product.id}" size="2")
22
+ - if product.packsize.present?
23
+ %button.pure-button.plus-pack(data-packsize="#{product.packsize}")
24
+ %i.fa.fa-plus-square
25
+ %i.fa.fa-cube
26
+ %button.pure-button.minus-pack(data-packsize="#{product.packsize}")
27
+ %i.fa.fa-minus-square
28
+ %i.fa.fa-cube
29
+ %button.pure-button.order-none
30
+ %i.fa.fa-remove
31
+ %td
32
+ - if product.packsize.present?
33
+ = product.packsize
34
+ - else
35
+ %i.fa.fa-ban
36
+
37
+
38
+ %br
39
+ %center
40
+ %button.pure-button.pure-button-primary
41
+ %i.fa.fa-envelope
42
+ Send me the mail!
@@ -0,0 +1,14 @@
1
+ %h2 Order #{@order.supplier} from #{@order.created_at}
2
+
3
+ %table.pure-table.pure-table-striped
4
+ %thead
5
+ %tr
6
+ %th Product
7
+ %th Shelve
8
+ %th Quantity
9
+ %tbody
10
+ - @order.order_items.where("num_ordered > 0").sort_by{|i| i.local_product.name}.each do |p|
11
+ %tr
12
+ %td=p.local_product.name
13
+ %td=p.local_product.shelve_nr
14
+ %td=p.num_ordered
@@ -0,0 +1,79 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 View Order
4
+
5
+ #modal-plot.modal-plot
6
+
7
+ = haml "order/_head".to_sym, locals: {order: @order}
8
+
9
+ - if @order.state == "new"
10
+ %form.pure-form.pure-form-aligned(action="" method="post")
11
+ -#%input(type="hidden" name="_method" value="put")
12
+
13
+ :javascript
14
+ $(function() {
15
+ $( "#tabs" ).tabs();
16
+ });
17
+
18
+ #tabs
19
+ - supplier_name = settings.supplier
20
+ - understocked_items = @order.order_items.select{|i| i.local_product.supplier==supplier_name && i.num_wished.nil?}
21
+ - unordered_items = []
22
+ - ordered_items = @order.order_items.select{|i| i.num_wished.present? && i.num_wished != 0}
23
+ - ignored_items = @order.order_items.select{|i| i.local_product.supplier==supplier_name && i.num_wished == 0}
24
+ - other_items = []
25
+ - all_items = []
26
+ %ul
27
+ %li
28
+ %a(href="#under_min")undecided [#{understocked_items.count}]
29
+ %li
30
+ %a(href="#ordered")ordered [#{ordered_items.count}]
31
+ %li
32
+ %a(href="#ignored")ignored [#{ignored_items.count}]
33
+ %li
34
+ %a(href="#more")more
35
+ #under_min
36
+ = haml "order/_item_table".to_sym, locals: {order_items: understocked_items}
37
+ #ordered
38
+ = haml "order/_item_table".to_sym, locals: {order_items: ordered_items}
39
+ #ignored
40
+ = haml "order/_item_table".to_sym, locals: {order_items: ignored_items}
41
+ #more
42
+ %p
43
+ Add another item?
44
+ %br
45
+ %h2 Action
46
+ %center
47
+ (Find remote order? Delete?)
48
+ %button.pure-button.pure-button-secondary(name="action" value="save")
49
+ Save
50
+ %button.pure-button.pure-button-primary(name="action" value="order")
51
+ Order!
52
+ %button.pure-button.pure-button-primary(name="action" value="delete")
53
+ Delete
54
+ - else
55
+ %table.pure-table
56
+ %thead
57
+ %tr
58
+ %th
59
+ Item
60
+ %th
61
+ Wished Qty
62
+ %th
63
+ Ordered Qty
64
+ %th
65
+ Stock at time
66
+ %tbody
67
+ - @order.order_items.find_each do |item|
68
+ %tr
69
+ %td
70
+ = local_product_link item.local_product
71
+ %td
72
+ =item.num_wished
73
+ %td
74
+ =item.num_ordered
75
+ %td
76
+ =item.current_stock
77
+ %h2 Action
78
+ (Find remote order? Delete?)
79
+
@@ -0,0 +1,40 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 Orders
4
+
5
+ - if Order.current.present?
6
+ %a(href="/order/#{Order.current.id}")
7
+ Current Order
8
+ - else
9
+ %a(href="/order/new") New Order
10
+
11
+ %br
12
+ - if @orders.count > 0
13
+ %br
14
+
15
+ %table.pure-table
16
+ %thead
17
+ %tr
18
+ %th Date
19
+ %th Number of Items
20
+ %th Action
21
+ %th State
22
+ %tbody
23
+ - @orders.each do |order|
24
+ %tr
25
+ %td=order.created_at
26
+ %td
27
+ = order.order_items.count
28
+ (
29
+ = order.order_items.processible.count
30
+ )
31
+ %td
32
+ %a.pure-button(href="/order/#{order.id}")
33
+ %i.fa.fa-eye
34
+ View
35
+ - if order.state == "ordered"
36
+ %a.pure-button(href="/order/#{order.id}/packlist")
37
+ %i.fa.fa-paper
38
+ Packlist
39
+
40
+ %td=order.state
@@ -0,0 +1,24 @@
1
+ .icon#headicon
2
+ = order_icon
3
+
4
+ .pure-u-1
5
+ .pure-menu.pure-menu-horizontal#submenu
6
+ %small
7
+ %center
8
+ %ul.pure-menu-list
9
+ %li.pure-menu-item
10
+ %a.pure-menu-link(href="/orders")
11
+ = index_icon
12
+ Orders
13
+ %li.pure-menu-item
14
+ %a.pure-menu-link(href="/order/new")
15
+ %i(class="fa fa-plus")
16
+ New or current
17
+ %li.pure-menu-item
18
+ %a.pure-menu-link(href="/orders/non_remote")
19
+ %i(class="fa fa-envelope-o")
20
+ Other Suppliers
21
+ %li.pure-menu-item
22
+ %a.pure-menu-link(href="/remote_orders")
23
+ %i(class="fa fa-globe")
24
+ Remote
@@ -0,0 +1,8 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 Non-Remote Order
4
+
5
+ - Supplier.find_each do |supplier|
6
+ %a.supplier(href="/order/non_remote/#{supplier.id}")
7
+ =supplier.name
8
+ %br
@@ -0,0 +1,60 @@
1
+ %div
2
+ %div
3
+ %div
4
+ %canvas(id="canvas" height="450" width="800")
5
+
6
+ - sales_value = ->(h) { h[:sales].to_i }
7
+ :javascript
8
+ //Chart.defaults.global.multiTooltipTemplate = "<%= datasetLabel %>: <%= value %>";
9
+ Chart.defaults.global.hover.mode = 'label';
10
+ Chart.defaults.global.tooltips.mode = 'label';
11
+
12
+ var salesData = {
13
+ labels : [#{plot_data.values.map{|v| "'#{v[:label].to_s}'"}.join(',')}],
14
+ datasets : [
15
+ {
16
+ label: "Product sales",
17
+ fill: false,
18
+ lineTension: 0.2,
19
+ borderColor: "rgba(75,192,142,1)",
20
+ borderCapStyle: 'round',
21
+ pointBorderColor: "rgba(75,142,112,1)",
22
+ pointBackgroundColor: "#fff",
23
+ pointBorderWidth: 1,
24
+ pointHoverRadius: 8,
25
+ pointHoverBackgroundColor: "rgba(75,192,192,1)",
26
+ pointHoverBorderColor: "rgba(220,220,220,1)",
27
+ pointHoverBorderWidth: 2,
28
+ pointRadius: 2,
29
+ pointHitRadius: 10,
30
+ data : [#{plot_data.values.map(&sales_value).join(',')}]
31
+ },
32
+ {
33
+ label: "Product stock",
34
+ fill: true,
35
+ lineTension: 0.2,
36
+ backgroundColor: "rgba(175,155,155,0.4)",
37
+ borderColor: "rgba(105,112,172,1)",
38
+ borderCapStyle: 'round',
39
+ pointBorderColor: "rgba(155,152,182,1)",
40
+ pointBackgroundColor: "#fff",
41
+ pointBorderWidth: 1,
42
+ pointHoverRadius: 8,
43
+ pointHoverBackgroundColor: "rgba(99,102,152,1)",
44
+ pointHoverBorderColor: "rgba(210,210,210,1)",
45
+ pointHoverBorderWidth: 2,
46
+ pointRadius: 2,
47
+ pointHitRadius: 10,
48
+ data : [#{plot_data.values.map{|v| v[:stock].nil? ? 'null' : v[:stock].to_i}.join(',')}]
49
+ /*data : [#{plot_data.values.map{|v| v[:stock].to_i}.join(',')}]*/
50
+ }
51
+ ]
52
+ }
53
+
54
+ var ctx = document.getElementById("canvas").getContext("2d");
55
+ window.myLine = new Chart(ctx, {
56
+ type: 'line',
57
+ data: salesData,
58
+ options: {},
59
+ responsive: true,
60
+ });
@@ -0,0 +1,29 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1 Link "#{@product.name}" to ...
4
+
5
+ :javascript
6
+ $(function() {
7
+ $( "#tabs" ).tabs();
8
+ });
9
+
10
+ #tabs
11
+ %ul
12
+ - if !@product.link_suggestions.empty?
13
+ %li
14
+ %a(href="#tab_suggestions") Suggestions
15
+ %li
16
+ %a(href="#tab_unlinked") Unlinked
17
+ %li
18
+ %a(href="#tab_linked") Linked
19
+ - if !@product.link_suggestions.empty?
20
+ #tab_suggestions
21
+ %h2 Suggestions
22
+ = haml "products/_link_table".to_sym, locals: {products: @product.link_suggestions }
23
+ #tab_unlinked
24
+ %h2 Unlinked Remote Products
25
+ = haml "products/_link_table".to_sym, locals: {products: @remote_products.unlinked}
26
+ #tab_linked
27
+ %h2 Already Linked Remote Products
28
+ = haml "products/_link_table".to_sym, locals: {products: @remote_products.linked}
29
+
@@ -0,0 +1,64 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1= @product.name
4
+
5
+ %form.pure-form.pure-form-aligned(action="" method="post")
6
+ %input(type="hidden" name="_method" value="put")
7
+ %fieldset
8
+ .pure-control-group
9
+ %label(for="product_id") Product ID
10
+ %input#product_id(type="text" readonly value="#{@product.product_id}")
11
+ .pure-control-group
12
+ %label(for="product_page") Product Page (Shop frontend)
13
+ - frontend_url = Rawbotz::LocalShop.product_page_frontend(@product, settings.conf)
14
+ %a(href="#{frontend_url}" target="blank")
15
+ = frontend_url
16
+ .pure-control-group
17
+ %label(for="product_page") Product Page (Shop backend)
18
+ - backend_url = Rawbotz::LocalShop.product_page_backend(@product, settings.conf)
19
+ %a(href="#{backend_url}" target="blank")
20
+ = backend_url
21
+ .pure-control-group
22
+ %label(for="supplier") Supplier
23
+ = @product.supplier.try(:name)
24
+ .pure-control-group
25
+ %label(for="supplier") Remote Product
26
+ - if @product.remote_product.nil?
27
+ %a(href="/product/#{@product.id}/link") Link to ...
28
+ - else
29
+ = remote_product_link @product
30
+ .pure-control-group
31
+ %label(for="packsize") Pack size
32
+ = @product.packsize
33
+ .pure-control-group
34
+ %label(for="shelve") Shelve
35
+ = @product.shelve_nr
36
+
37
+ %h2 Actions
38
+ - if !@product.remote_product.present?
39
+ = haml "widgets/_link".to_sym, locals: {local_product: @product, redirect_to: 'product'}
40
+ %br
41
+ = haml :"_hide_unhide_button", locals: {product: @product}
42
+
43
+ - if @plot_data.any?
44
+ .pure-g
45
+ .pure-u-1-1
46
+ %h2 Stock and Sales Values (30 days)
47
+ .pure-u-2-5
48
+ %table.pure-table
49
+ %thead
50
+ %tr
51
+ %th Date
52
+ %th Qty in Stock
53
+ %th Qty Sold
54
+ %tbody
55
+ - @plot_data.values.each do |s|
56
+ %tr{:class => s[:stock].to_i <= 0 ? "empty-stock" : ""}
57
+ %td= s[:label]
58
+ %td= s[:stock]
59
+ %td= s[:sales]
60
+
61
+ .pure-u-3-5
62
+ = haml :"product/_stock_sales_plot", locals: {plot_data: @plot_data}
63
+ -#%h2 Orders
64
+ -#= product.order_items.order ... link
@@ -0,0 +1,38 @@
1
+ %table.pure-table.pure-table-striped
2
+ %thead
3
+ %tr
4
+ %th Product Name
5
+ %th Product ID
6
+ %th Supplier
7
+ %th Action
8
+ %tbody
9
+ -# find_each does not work on link_suggestions array
10
+ - products.each do |product|
11
+ %tr
12
+ %td= product.name
13
+ %td= product.product_id
14
+ %td= product.supplier.try(:name)
15
+ %td
16
+ %form.pure-form.pure-form-aligned(action="" method="post")
17
+ %input(type="hidden" name="remote_product_id" value="#{product.id}")
18
+ - if @product.remote_product.nil?
19
+ - if product.local_product
20
+ Currently linked to #{product.local_product.name}
21
+ %button.pure-button.pure-button-primary(type="submit")
22
+ = link_icon
23
+ Set link
24
+ - else
25
+ %button.pure-button.pure-button-primary(type="submit")
26
+ = link_icon
27
+ Create link
28
+ - else
29
+ -#Currently linked to #{product_link @prod
30
+ - if product.local_product
31
+ Currently already linked to #{product.local_product.name}
32
+ %button.pure-button.pure-button-error(type="submit")
33
+ = link_icon
34
+ Set Link
35
+ - else
36
+ %button.pure-button.pure-button-error(type="submit")
37
+ = link_icon
38
+ Set Link