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,36 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1 Products by Supplier
4
+
5
+ :javascript
6
+ $(function() {
7
+ $( "#tabs" ).tabs();
8
+ });
9
+
10
+ #tabs
11
+ %ul
12
+ %li
13
+ %a(href="#tab_all_products") All
14
+ - @suppliers.each_with_index do |supplier, idx|
15
+ %li
16
+ %a(href="#tab_#{idx}")="#{supplier.name} (#{@products.supplied_by(supplier).count})"
17
+ %li
18
+ %a(href="#tab_no_supplier") [no supplier] (#{@products.where(supplier_id: nil).count})
19
+ %li
20
+ %a(href="#tab_hidden_products") Hidden (#{@products.all_hidden.count})
21
+ #tab_all_products
22
+ %h2 All Products
23
+ = haml "products/table".to_sym, locals: {products: @products.all}
24
+ - @suppliers.each_with_index do |supplier, idx|
25
+ %div{id:"tab_#{idx}"}
26
+ %h2 Products of #{supplier.name || "Unknown Supplier"}
27
+ - if supplier == settings.supplier
28
+ = haml "products/table_with_linking".to_sym, locals: {products: @products.supplied_by(supplier)}
29
+ - else
30
+ = haml "products/table".to_sym, locals: {products: @products.supplied_by(supplier)}
31
+ #tab_no_supplier
32
+ %h2 Products without supplier
33
+ = haml "products/table".to_sym, locals: {products: @products.where(supplier_id: nil)}
34
+ #tab_hidden_products
35
+ %h2 Hidden Products
36
+ = haml "products/table".to_sym, locals: {products: @products.all_hidden}
@@ -0,0 +1,48 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1 Link Wizard
4
+
5
+ - if @unlinked_count == 0
6
+ %h2
7
+ Nothing to do! Congratulations!
8
+ %i.fa.fa-birthday-cake
9
+ -else
10
+ #{@unlinked_count}/#{settings.supplier.local_products.count} unlinked local products from #{settings.supplier.name}
11
+
12
+ %h2
13
+ = product_link @local_product
14
+
15
+ %center
16
+ %table.pure-table
17
+ %tr
18
+ %td
19
+ = haml "widgets/_link".to_sym, locals: {local_product: @local_product, redirect_to: "link_wizard"}
20
+ -#%form.pure-form(action="/product/#{@local_product.id}/link" method="POST")
21
+ -# %input(type="hidden" name="remote_product_id" id="remote_product_id")
22
+ -# %input(type="hidden" name="redirect_to" value="link_wizard")
23
+ -# %input#search-remote(placeholder="search ...")
24
+ -# %button.pure-button
25
+ -# Link!
26
+ %td
27
+ - if @local_product.link_suggestions.count > 0
28
+ Suggenstions:
29
+ %br
30
+ - @local_product.link_suggestions.each do |suggested_product|
31
+ %form.pure-form(action="/product/#{@local_product.id}/link" method="POST")
32
+ %input(type="hidden" name="remote_product_id" id="remote_product_id" value="#{suggested_product.id}")
33
+ %input(type="hidden" name="redirect_to" value="link_wizard")
34
+ %button.pure-button
35
+ = suggested_product.name
36
+ %br
37
+ - else
38
+ (no suggestions)
39
+ %td
40
+ %a.pure-button(href="/products/link_wizard/#{params[:idx].to_i + 1}")
41
+ Skip
42
+ %br
43
+ %br
44
+ = haml :"_hide_unhide_button", locals: {product: @local_product}
45
+ %br
46
+ %p#message
47
+ %br
48
+
@@ -0,0 +1,65 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1 Product Linking
4
+
5
+ :javascript
6
+ $(function() {
7
+ $( "#tabs" ).tabs();
8
+ });
9
+
10
+ #tabs
11
+ %ul
12
+ %li
13
+ %a(href="#local_unlinked")Local unlinked (#{settings.supplier.name}) (#{@local_products.unlinked.count})
14
+ %li
15
+ %a(href="#local_linked")Local linked (#{settings.supplier.name}) (#{@local_products.linked.count})
16
+ %li
17
+ %a(href="#remote_linked")Remote linked (#{settings.supplier.remote_products.linked.count})
18
+ %li
19
+ %a(href="#remote_unlinked")Remote unlinked (#{settings.supplier.remote_products.unlinked.count})
20
+ #local_linked
21
+ %table.pure-table.pure-table-striped
22
+ %thead
23
+ %tr
24
+ %th Local Product
25
+ %th Remote Product
26
+ %th Action
27
+ %tbody
28
+ - @local_products.linked.each do |local_product|
29
+ %tr
30
+ %td=local_product_link(local_product)
31
+ %td=remote_product_link(local_product.remote_product)
32
+ %td
33
+ %a.pure-button(href="/product/#{local_product.id}/link")
34
+ = link_icon
35
+ Change Link
36
+ #local_unlinked
37
+ %table.pure-table.pure-table-striped
38
+ %thead
39
+ %tr
40
+ %th Local Product
41
+ %th Suggested Remote Products
42
+ %th Action
43
+ %tbody
44
+ - @local_products.unlinked.each do |local_product|
45
+ %tr
46
+ %td=local_product_link(local_product)
47
+ %td
48
+ -local_product.link_suggestions.each do |suggested_product|
49
+ %form.pure-form.pure-form-aligned(action="/product/#{local_product.id}/link" method="post")
50
+ %input(type="hidden" name="remote_product_id" value="#{suggested_product.id}")
51
+ %input(type="hidden" name="redirect_to" value="links")
52
+ %button.pure-button.pure-button-primary(type="submit")
53
+ %small
54
+ %small
55
+ Link to
56
+ = suggested_product.name
57
+ %br
58
+ %td
59
+ %a.pure-button.pure-button-primary(href="/product/#{local_product.id}/link")
60
+ = link_icon
61
+ Link
62
+ #remote_linked
63
+ = haml "remote_products/_table".to_sym, locals: {products: @remote_products.supplied_by(settings.supplier).linked}
64
+ #remote_unlinked
65
+ = haml "remote_products/_table".to_sym, locals: {products: @remote_products.supplied_by(settings.supplier).unlinked}
@@ -0,0 +1,27 @@
1
+ .icon#headicon
2
+ = products_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="/products")
11
+ = index_icon
12
+ Local Products
13
+ %ul.pure-menu-list
14
+ %li.pure-menu-item
15
+ %a.pure-menu-link(href="/remote_products")
16
+ %i(class="fa fa-globe")
17
+ Remote Products
18
+ %ul.pure-menu-list
19
+ %li.pure-menu-item
20
+ %a.pure-menu-link(href="/products/links")
21
+ %i(class="fa fa-link")
22
+ Product Linking
23
+ %ul.pure-menu-list
24
+ %li.pure-menu-item
25
+ %a.pure-menu-link(href="/products/link_wizard")
26
+ %i(class="fa fa-magic")
27
+ Product Link Wizard
@@ -0,0 +1,20 @@
1
+ %table.pure-table
2
+ %thead
3
+ %tr
4
+ %th
5
+ Product name
6
+ %th
7
+ Product ID
8
+ %th
9
+ Supplier
10
+ -#%th
11
+ -# Last Stock
12
+ %tbody
13
+ - products.each do |product|
14
+ %tr
15
+ %td
16
+ = product_link product
17
+ %td= product.product_id
18
+ %td= product.supplier.try(:name)
19
+ -#%td
20
+ -# %a(href="") Show modal
@@ -0,0 +1,30 @@
1
+ %table.pure-table
2
+ %thead
3
+ %tr
4
+ %th
5
+ Product name
6
+ %th
7
+ Product ID
8
+ %th
9
+ Remote Name
10
+ %th
11
+ Supplier
12
+ %th
13
+ Last Stock
14
+ %tbody
15
+ - products.each do |product|
16
+ %tr
17
+ %input.local_product_id(type="hidden" value="#{product.id}")
18
+ %td
19
+ %a(href="/product/#{product.id}")= product.name
20
+ %td= product.product_id
21
+ %td
22
+ - if product.remote_product.nil?
23
+ %a(href="/product/#{product.id}/link") Linking view
24
+ = haml "widgets/_ajax_link".to_sym, locals: {local_product: product, redirect_to: 'products'}
25
+ - else
26
+ = product.remote_product.name
27
+ %td= product.supplier.try(:name)
28
+ %td
29
+ %a(href="") Show modal
30
+
@@ -0,0 +1,30 @@
1
+ %h1 Remote Cart
2
+
3
+ %center
4
+ Currently #{@cart_content.size} items in cart.
5
+ %br
6
+ %br
7
+ %table.pure-table
8
+ %thead
9
+ %tr
10
+ %th
11
+ Product
12
+ %th
13
+ Local Name
14
+ %th
15
+ Quantity
16
+ %tbody
17
+ - @cart_products.each do |product, qty|
18
+ - if product.nil?
19
+ %tr
20
+ %td unknown product
21
+ %td unknown product
22
+ %td unknown product
23
+ - else
24
+ %tr
25
+ %td
26
+ = remote_product_link product
27
+ %td
28
+ = local_product_link(product.local_product) rescue "unlinked"
29
+ %td
30
+ = qty
@@ -0,0 +1,35 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 Remote Order
4
+
5
+
6
+ ID #{@remote_order_id}
7
+ %br
8
+
9
+ %table.pure-table.pure-table-striped
10
+ %thead
11
+ %tr
12
+ %th Remote Name
13
+ %th Local Name
14
+ %th Qty
15
+ %th Refund
16
+ %th Shelve
17
+ %tbody
18
+ - @remote_products_qty.sort_by{|p,_| p.name}.each do |p, q|
19
+ %tr
20
+ %td
21
+ = remote_product_link p
22
+ %td
23
+ -if p.local_product
24
+ %a(href="/product/#{p.local_product.id}")
25
+ = p.local_product.name
26
+ -elsif p.is_a? RemoteProduct
27
+ %a(href="/remote_product/#{p.id}/link")
28
+ Link (broken)
29
+ -else
30
+ not in database
31
+ %td=q
32
+ %td
33
+ %td
34
+ -if shelve = p.local_product.try(:shelve_nr)
35
+ = shelve
@@ -0,0 +1,20 @@
1
+ = haml "orders/menu".to_sym
2
+
3
+ %h1 Remote Orders
4
+
5
+ %center
6
+ %table.pure-table.pure-table-striped
7
+ %tr
8
+ %th Date
9
+ %th Volume
10
+ %th Action
11
+ - @last_orders.each do |p|
12
+ %tr
13
+ %td=p[0]
14
+ %td=p[1]
15
+ %td
16
+ %a(href="#{p[2]}")
17
+ Visit remote shop
18
+ %br
19
+ %a(href="/remote_order/#{p[2][/\d+/]}")
20
+ View
@@ -0,0 +1,90 @@
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
13
+ %a(href="#{Rawbotz::RemoteShop.product_page_url(@product, settings.conf)}" target="blank")
14
+ =Rawbotz::RemoteShop.product_page_url(@product, settings.conf)
15
+ .pure-control-group
16
+ %label(for="supplier") Supplier
17
+ = @product.supplier.try(:name)
18
+ .pure-control-group
19
+ %label(for="supplier") Local Product
20
+ - if @product.local_product.nil?
21
+ create link
22
+ - else
23
+ = local_product_link @product.local_product
24
+ - if packsize = @product.local_product.try(:packsize)
25
+ .pure-control-group
26
+ %label(for="packsize") Pack size
27
+ = packsize
28
+ - if shelve = @product.local_product.try(:shelve_nr)
29
+ .pure-control-group
30
+ %label(for="shelve") Shelve
31
+ = shelve
32
+ -# if supplier == settings.supplier ... show a link to product page (in shop catalog/product/view/id/ ...
33
+
34
+ -#- if @product.stock_items.present?
35
+ -# %h2 Stock Values
36
+ -# %table.pure-table
37
+ -# %thead
38
+ -# %tr
39
+ -# %th Date
40
+ -# %th Qty
41
+ -# %tbody
42
+ -# - @product.stock_items.each do |s|
43
+ -# %tr
44
+ -# %td= s.date
45
+ -# %td= s.qty
46
+
47
+ -#%div(style="width:60%")
48
+ -# %div
49
+ -# %div
50
+ -# %canvas(id="canvas" height="450" width="800")
51
+ -#
52
+ -#:javascript
53
+ -# // animate true?
54
+ -# var randomScalingFactor = function(){ return Math.round(Math.random()*100)}; // ??
55
+ -# Chart.defaults.global.multiTooltipTemplate = "<%= value %>";
56
+ -# var lineChartData = {
57
+ -# labels : [#{@sales.uniq.map{|s| "\"#{s[0]}\""}.reverse.join(',')}],
58
+ -# datasets : [
59
+ -# {
60
+ -# label: "Product sales",
61
+ -# fillColor : "rgba(220,220,220,0.2)",
62
+ -# strokeColor : "rgba(220,220,220,1)",
63
+ -# pointColor : "rgba(220,220,220,1)",
64
+ -# pointStrokeColor : "#fff",
65
+ -# pointHighlightFill : "#fff",
66
+ -# pointHighlightStroke : "rgba(220,220,220,1)",
67
+ -# data : [#{@sales.uniq.map{|s| "\"#{s[1]}\""}.reverse.join(',')}]
68
+ -# },
69
+ -# {
70
+ -# label: "Product",
71
+ -# fillColor : "rgba(220,220,220,0.2)",
72
+ -# strokeColor : "rgba(220,220,220,1)",
73
+ -# pointColor : "rgba(120,120,220,1)",
74
+ -# pointStrokeColor : "#fff",
75
+ -# pointHighlightFill : "#fff",
76
+ -# pointHighlightStroke : "rgba(220,220,220,1)",
77
+ -# data : [#{(@product.stock_items.map(&:qty) * @sales.uniq.length).join(',')}]
78
+ -# }
79
+ -# ]
80
+ -# }
81
+ -#
82
+ -# window.onload = function(){
83
+ -# var ctx = document.getElementById("canvas").getContext("2d");
84
+ -# window.myLine = new Chart(ctx).Line(lineChartData, {
85
+ -# responsive: true
86
+ -# });
87
+ -# }
88
+ -#
89
+ -#%h2 Orders
90
+
@@ -0,0 +1,15 @@
1
+ %table.pure-table.pure-table-horizontal
2
+ %thead
3
+ %tr
4
+ %th Remote Product
5
+ %th Local Product
6
+ %tbody
7
+ - products.each do |product|
8
+ %tr
9
+ %td=remote_product_link(product)
10
+ %td
11
+ - if product.local_product.present?
12
+ = local_product_link product.local_product
13
+ - else
14
+ = haml "widgets/_link_line".to_sym, locals: {direction: :remote_local, product_id: product.id}
15
+
@@ -0,0 +1,30 @@
1
+ = haml "products/menu".to_sym
2
+
3
+ %h1 Remote Products
4
+
5
+ %h2 of supplier #{settings.supplier.name} (#{@products.count})
6
+
7
+ %table.pure-table
8
+ %thead
9
+ %tr
10
+ %th
11
+ Product Name
12
+ %th
13
+ Product ID
14
+ %th
15
+ Local Name
16
+ %th
17
+ Supplier
18
+ %tbody
19
+ - @products.find_each do |product|
20
+ %tr
21
+ %td
22
+ %a(href="/remote_product/#{product.id}")= product.name
23
+ %td= product.product_id
24
+ %td
25
+ - if product.local_product.nil?
26
+ -#%a(href="/product/#{product.id}/link") Link to ...
27
+ Not linked
28
+ - else
29
+ = local_product_link product.local_product
30
+ %td= product.supplier.try(:name)
@@ -0,0 +1,63 @@
1
+ .icon#headicon
2
+ = settings_icon
3
+
4
+ = haml "maintenance/menu".to_sym
5
+
6
+ %h2 Supplier #{@supplier.name}
7
+
8
+ %form.pure-form.pure-form-aligned(action="" method="post")
9
+ %input(type="hidden" name="_method" value="put")
10
+ %fieldset
11
+ .pure-control-group
12
+ %label(for="email") E-Mail address
13
+ %input#email(name="email" type="email" value="#{@supplier.email}")
14
+
15
+ .pure-control-group
16
+ %label(for="order_template") Order Template
17
+ %textarea#order_template(name="order_template" value="#{@supplier.order_template}" rows="10" cols="80")~ @supplier.order_template
18
+
19
+ .pure-control-group
20
+ %button.pure-button.pure-button-primary
21
+ %i.fa.fa-save
22
+ Save
23
+ %h3 Help
24
+ .pure-control-group
25
+ %em
26
+ How to fill out templates:
27
+ .pure-control-group
28
+ See the example template in the following textarea. The line starting with a star (*) will be repeated. A list of supported symbols can be found below.
29
+ %br
30
+ %textarea#example_order_template(name="example_order_template" readonly rows="10" cols="80")
31
+ :preserve
32
+ SUBJECT=Order NAME
33
+
34
+ Dear NAME,
35
+
36
+ We will order
37
+
38
+ * PRODUCTCODE QTY (QTY_PACKS of PACKSIZE) PRODUCTNAME
39
+
40
+ Thank you,
41
+
42
+ us.
43
+ %br
44
+ Following symbols are supported:
45
+ %br
46
+ %dl
47
+ %dt SUBJECT=
48
+ %dd will be subject of the mail (and NOT included in mail itself)
49
+ %dt NAME
50
+ %dd will be replaced by this suppliers name
51
+ %dt *
52
+ %dd the line starting with a star will be iterated over with every product
53
+ %dt PRODUCTCODE
54
+ %dd the product code as stored in magento
55
+ %dt QTY
56
+ %dd quantity ordered
57
+ %dt QTY_PACKS
58
+ %dd quantity ordered (in packs of PACKSIZE)
59
+ %dt PACKSIZE
60
+ %dd packsize as stored in magento
61
+ %dt PRODUCTNAME
62
+ %dd the products name
63
+ %br
@@ -0,0 +1,13 @@
1
+ .icon#headicon
2
+ = settings_icon
3
+
4
+ = haml "maintenance/menu".to_sym
5
+
6
+ %h1 Suppliers
7
+
8
+ %ul.float_ul
9
+ - @suppliers.find_each do |supplier|
10
+ %li
11
+ %a.supplier(href="/supplier/#{supplier.id}")
12
+ =supplier.name
13
+ %br
@@ -0,0 +1,32 @@
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
+ %body
16
+ .pure-g
17
+ .pure-u-1#main
18
+ - if flash
19
+ - if msg = flash.delete(:error)
20
+ #flash.ui-state-error
21
+ = msg.join(" | ")
22
+ - if msg = flash.delete(:success)
23
+ #flash.ui-state-highlight
24
+ = msg.join(" | ")
25
+ - if msg = flash.delete(:failure)
26
+ #flash.ui-state-highlight
27
+ = msg.join(" | ")
28
+ - if msg = flash.delete(:info)
29
+ #flash.ui-state-highlight
30
+ = msg.join(" | ")
31
+
32
+ =yield
@@ -0,0 +1,5 @@
1
+ .ajax_link_area.pure-form
2
+ %input.search-remote-ajax(placeholder="search ...")
3
+ %input.remote_product_id(type="hidden")
4
+ %a.ajax_product_link(href="")
5
+ Link!
@@ -0,0 +1,6 @@
1
+ %form.pure-form(action="/product/#{local_product.id}/link" method="POST")
2
+ %input(type="hidden" name="remote_product_id" id="remote_product_id")
3
+ %input(type="hidden" name="redirect_to" value="#{redirect_to}")
4
+ %input#search-remote(placeholder="search ...")
5
+ %button.pure-button
6
+ Link!
@@ -0,0 +1,15 @@
1
+ - if locals[:direction] == :remote_local
2
+ .link_line
3
+ .result(style="display:none;")
4
+ .ajax_link_area.pure-form
5
+ %input.search-local-ajax(placeholder="search ...")
6
+ %input.local_product_id(type="hidden")
7
+ %input.remote_product_id(type="hidden" value="#{product_id}")
8
+ %a.product_link_action.pure-button(href="")
9
+ Link
10
+ - else
11
+ .ajax_link_area.pure-form
12
+ %input.search-remote-ajax(placeholder="search ...")
13
+ %input.remote_product_id(type="hidden")
14
+ %a.ajax_product_link(href="")
15
+ Link! LR
data/lib/rawbotz.rb ADDED
@@ -0,0 +1,77 @@
1
+ require "rawbotz/version"
2
+ require "rawbotz/remote_shop"
3
+ require "rawbotz/local_shop"
4
+ require "rawbotz/order_processor"
5
+ require "rawbotz/datapolate"
6
+ require "rawbotz/product_updater"
7
+ require "rawbotz/routes"
8
+ require "rawbotz/mail_template"
9
+
10
+ require 'rawgento_models'
11
+ require 'rawgento_db'
12
+
13
+ require 'ostruct'
14
+ require 'yaml'
15
+ require 'pony'
16
+
17
+ module Rawbotz
18
+ @@conf_file_path = nil
19
+ def self.conf_file_path=(conf_file_path)
20
+ @@conf_file_path = conf_file_path
21
+ end
22
+ def self.conf_file_path
23
+ @@conf_file_path
24
+ end
25
+
26
+ # Configure components (from config file path), exit 1 if fails.
27
+ # 'logs' to STDERR (TODO)
28
+ def self.configure!
29
+ begin
30
+ RawgentoModels.establish_connection @@conf_file_path
31
+ rescue
32
+ STDERR.puts "Could not establish rawbotz-database connection (read config from: #{@@conf_file_path})"
33
+ exit 1
34
+ end
35
+ begin
36
+ RawgentoDB.settings @@conf_file_path
37
+ rescue
38
+ STDERR.puts "Could not establish magento-database connection (read config from: #{@@conf_file_path})"
39
+ exit 1
40
+ end
41
+ # As a bonus, set mechs config (TODO)
42
+ end
43
+
44
+ def self.logger
45
+ @logger ||= Logger.new(STDOUT)
46
+ end
47
+ def self.logger= logger
48
+ @logger = logger
49
+ end
50
+ def self.configure_logger options
51
+ logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO
52
+ end
53
+
54
+ def self.new_mech
55
+ config_values = YAML::load_file(@@conf_file_path)["remote_shop"]
56
+ MagentoMech.from_config OpenStruct.new(config_values)
57
+ end
58
+
59
+ def self.mail subject, body
60
+ # From config, this should be memoized
61
+ settings = YAML::load_file(Rawbotz::conf_file_path)["mail"]
62
+ pony_via_options = { address: settings["host"],
63
+ user_name: settings["user"],
64
+ port: settings["port"].to_i,
65
+ authentication: :login,
66
+ password: settings["pass"]}
67
+
68
+ Pony.mail({
69
+ to: settings["to"],
70
+ from: settings["from"],
71
+ subject: subject,
72
+ body: body,
73
+ via: :smtp,
74
+ via_options: pony_via_options
75
+ })
76
+ end
77
+ end