spree_tradebyte 0.1.12.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.byebug_history +39 -0
  3. data/.gitignore +22 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +24 -0
  6. data/.travis.yml +31 -0
  7. data/Appraisals +29 -0
  8. data/Gemfile +16 -0
  9. data/LICENSE +26 -0
  10. data/README.md +59 -0
  11. data/Rakefile +21 -0
  12. data/app/assets/javascripts/spree/backend/spree_tradebyte.js +2 -0
  13. data/app/assets/javascripts/spree/frontend/spree_tradebyte.js +2 -0
  14. data/app/assets/stylesheets/spree/backend/spree_tradebyte.css +4 -0
  15. data/app/assets/stylesheets/spree/frontend/spree_tradebyte.css +4 -0
  16. data/app/jobs/spree_tradebyte/application_job.rb +7 -0
  17. data/app/jobs/spree_tradebyte/export_products_job.rb +229 -0
  18. data/app/jobs/spree_tradebyte/export_stock_job.rb +39 -0
  19. data/app/jobs/spree_tradebyte/import_orders_job.rb +70 -0
  20. data/app/jobs/spree_tradebyte/order/processor.rb +158 -0
  21. data/app/mailers/application_mailer.rb +5 -0
  22. data/app/mailers/spree_tradebyte/error_notification_mailer.rb +9 -0
  23. data/app/models/spree/order/mail_defuser.rb +15 -0
  24. data/app/models/spree/order/tradebyte_message_builder.rb +133 -0
  25. data/app/models/spree/order_decorator.rb +14 -0
  26. data/app/models/spree/order_updater_decorator.rb +18 -0
  27. data/app/models/spree/payment_method/tradebyte.rb +7 -0
  28. data/app/models/spree/product_decorator.rb +15 -0
  29. data/app/models/spree/reimbursement/mail_defuser.rb +9 -0
  30. data/app/models/spree/reimbursement_decorator.rb +11 -0
  31. data/app/models/spree/shipment_decorator.rb +9 -0
  32. data/app/models/spree/shipment_handler/mail_defuser.rb +7 -0
  33. data/app/models/spree/shipment_handler_decorator.rb +5 -0
  34. data/app/models/spree/variant_decorator.rb +47 -0
  35. data/app/overrides/order_index.rb +13 -0
  36. data/app/overrides/tradebyte_settings.rb +13 -0
  37. data/app/views/layouts/spree_tradebyte/mailer.html.erb +13 -0
  38. data/app/views/layouts/spree_tradebyte/mailer.text.erb +1 -0
  39. data/app/views/spree/admin/orders/_index_tradebyte_state_override.html.erb +7 -0
  40. data/app/views/spree/admin/orders/_index_tradebyte_state_override_head.html.erb +1 -0
  41. data/app/views/spree/admin/products/_tradebyte_fields.html.erb +15 -0
  42. data/app/views/spree/admin/variants/_tradebyte_fields.html.erb +16 -0
  43. data/app/views/spree_tradebyte/error_notification_mailer/exception_mail.html.erb +12 -0
  44. data/bin/rails +8 -0
  45. data/config/locales/en.yml +5 -0
  46. data/config/routes.rb +3 -0
  47. data/db/migrate/20190301122602_add_tradebyte_exported_to_spree_orders.rb +5 -0
  48. data/db/migrate/20190305123644_add_columns_to_spree_orders.rb +8 -0
  49. data/db/migrate/20190307133555_add_tradebyte_id_to_spree_line_items.rb +5 -0
  50. data/db/migrate/20190315162630_add_tradebyte_sku_to_line_items.rb +5 -0
  51. data/db/migrate/20190529120919_add_tradebyte_fields_to_products.rb +7 -0
  52. data/db/migrate/20190529145337_add_tradebyte_settings_to_spree_variants.rb +5 -0
  53. data/db/migrate/20190611114706_create_shipping_methods_for_tradebyte.rb +17 -0
  54. data/db/migrate/20190611114720_create_payment_method_for_tradebyte.rb +5 -0
  55. data/lib/generators/spree_tradebyte/install/install_generator.rb +28 -0
  56. data/lib/generators/spree_tradebyte/templates/initializer.rb +42 -0
  57. data/lib/helpers/setup_configuration.rb +27 -0
  58. data/lib/spree_tradebyte.rb +26 -0
  59. data/lib/spree_tradebyte/engine.rb +25 -0
  60. data/lib/spree_tradebyte/factories.rb +6 -0
  61. data/lib/spree_tradebyte/tb_logger.rb +14 -0
  62. data/lib/spree_tradebyte/tradebyte_ftp.rb +98 -0
  63. data/lib/spree_tradebyte/version.rb +18 -0
  64. data/lib/tasks/variants.rake +13 -0
  65. data/spree_tradebyte.gemspec +48 -0
  66. metadata +427 -0
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ OrderUpdater.class_eval do
3
+
4
+ # give each of the shipments a chance to update themselves
5
+ def update_shipments
6
+ shipping_method_filter = order.completed? ? ShippingMethod::DISPLAY_ON_BACK_END : ShippingMethod::DISPLAY_ON_FRONT_END
7
+
8
+ shipments.each do |shipment|
9
+ next unless shipment.persisted?
10
+
11
+ shipment.update!(order)
12
+ shipment.refresh_rates(shipping_method_filter)
13
+ shipment.update_amounts
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ class Spree::PaymentMethod::Tradebyte < Spree::PaymentMethod::Check
2
+
3
+ def navision_code(_ = nil)
4
+ 'TRADEBYTE'
5
+ end
6
+
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'storext'
2
+ require 'active_record/type'
3
+
4
+ Spree::Product.class_eval do
5
+ include Storext.model
6
+
7
+ store :tradebyte_settings, coder: JSON
8
+
9
+ store_attributes :tradebyte_settings do
10
+ SpreeTradebyte.channels.each do |channel|
11
+ send("#{channel}_active", ActiveModel::Type::Boolean, default: false)
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Reimbursement::MailDefuser
3
+
4
+ def send_reimbursement_email
5
+ super unless order.is_tradebyte_order?
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ Spree::Reimbursement.class_eval do
2
+
3
+ Spree::Reimbursement.state_machine.after_transition to: :reimbursed, do: :send_tradebyte_reimbursed_notifications
4
+
5
+ def send_tradebyte_reimbursed_notifications
6
+ order.tb_send_return_messages(return_items) if order.is_tradebyte_order?
7
+ end
8
+
9
+ self.prepend(Spree::Reimbursement::MailDefuser)
10
+
11
+ end
@@ -0,0 +1,9 @@
1
+ Spree::Shipment.class_eval do
2
+
3
+ Spree::Shipment.state_machine.after_transition :to => :shipped, :do => :send_tradebyte_shipped_notifications
4
+
5
+ def send_tradebyte_shipped_notifications
6
+ order.tb_send_shipped_messages(inventory_units)
7
+ end
8
+
9
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ module ShipmentHandler::MailDefuser
3
+ def send_shipped_email
4
+ super unless @shipment.order.is_tradebyte_order?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ Spree::ShipmentHandler.class_eval do
2
+
3
+ self.prepend(Spree::ShipmentHandler::MailDefuser)
4
+
5
+ end
@@ -0,0 +1,47 @@
1
+ require 'storext'
2
+
3
+ Spree::Variant.class_eval do
4
+
5
+ after_create :update_tradebyte_prices
6
+
7
+ include Storext.model
8
+ store :tradebyte_settings, coder: JSON
9
+
10
+ store_attributes :tradebyte_settings do
11
+ SpreeTradebyte.channels.each do |channel|
12
+ send("#{channel}_a_vk", Float, default: 0.0)
13
+ send("#{channel}_a_vk_old", Float, default: 0.0)
14
+ send("#{channel}_a_uvp", Float, default: 0.0)
15
+ end
16
+ end
17
+
18
+ has_one :master, through: :product
19
+
20
+ def all_images
21
+ if images.any?
22
+ images
23
+ else
24
+ variants_in_color = Spree::Variant.same_product_colors(self)
25
+ variant_with_images = variants_in_color.detect {|v| v.images.any?}
26
+ if variant_with_images
27
+ variant_with_images.images
28
+ else
29
+ master.images
30
+ end
31
+ end
32
+ end
33
+
34
+ def self.same_product_colors(variant)
35
+ joins(option_values: :translations).where(spree_option_value_translations: {presentation: variant.option_value('color')}, product_id: variant.product_id).includes(:default_price, option_values: :option_type)
36
+ end
37
+
38
+ def update_tradebyte_prices(new_price = self.price)
39
+ SpreeTradebyte.channels.each do |channel|
40
+ send("#{channel}_a_vk=", new_price)
41
+ send("#{channel}_a_vk_old=", new_price)
42
+ send("#{channel}_a_uvp=", new_price)
43
+ end
44
+ save!(validate: false)
45
+ end
46
+
47
+ end
@@ -0,0 +1,13 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/admin/orders/index',
3
+ name: 'add tradebyte order info header',
4
+ insert_after: '#listing_orders thead th:nth-last-child(3)',
5
+ partial: 'spree/admin/orders/index_tradebyte_state_override_head'
6
+ )
7
+
8
+ Deface::Override.new(
9
+ virtual_path: 'spree/admin/orders/index',
10
+ name: 'add tradebyte order info',
11
+ insert_after: '#listing_orders tbody td:nth-last-child(3)',
12
+ partial: 'spree/admin/orders/index_tradebyte_state_override'
13
+ )
@@ -0,0 +1,13 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/admin/products/_form',
3
+ name: 'tradebyte_product_details',
4
+ insert_bottom: '[data-hook="admin_product_form_additional_fields"]',
5
+ partial: 'spree/admin/products/tradebyte_fields'
6
+ )
7
+
8
+ Deface::Override.new(
9
+ virtual_path: 'spree/admin/variants/_form',
10
+ name: 'tradebyte_variant_details',
11
+ insert_after: '[data-hook="admin_variant_form_additional_fields"]',
12
+ partial: 'spree/admin/variants/tradebyte_fields'
13
+ )
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <style>
6
+ /* Email styles need to be inline */
7
+ </style>
8
+ </head>
9
+
10
+ <body>
11
+ <%= yield %>
12
+ </body>
13
+ </html>
@@ -0,0 +1,7 @@
1
+ <td>
2
+ <% if order.is_tradebyte_order? %>
3
+ <span class="label label-success">Tradebyte order (<%= order.tradebyte_channel_sign %>)</span>
4
+ <% else %>
5
+ <span class="label label-success">Regular order</span>
6
+ <% end %>
7
+ </td>
@@ -0,0 +1 @@
1
+ <th><%= sort_link @search, :is_tradebyte_order, 'Type' %></th>
@@ -0,0 +1,15 @@
1
+ <div data-hook="admin_product_form_custom_fields">
2
+ <%= f.field_container :tradebyte_settings, class: ['form-group'] do %>
3
+ <h3>Tradebyte settings</h3>
4
+
5
+ <% @product.tradebyte_settings.each do |k, _| %>
6
+ <div class="checkbox">
7
+ <%= f.label k do %>
8
+ <%= f.check_box k %>
9
+ <%= k.humanize %>
10
+ <% end %>
11
+ </div>
12
+ <% end %>
13
+
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,16 @@
1
+ <div class="col-xs-12 col-md-12" data-hook="admin_variant_tradebyte_settings">
2
+ <%= f.field_container :tradebyte_settings, class: ['form-group'] do %>
3
+ <h3>Tradebyte settings</h3>
4
+
5
+ <div class="row">
6
+ <% @variant.tradebyte_settings.each do |k,v| %>
7
+ <div class="form-group col-md-4">
8
+ <%= f.label k %>
9
+ <%= f.text_field k, value: v, class: 'form-control' %>
10
+ </div>
11
+ <% end %>
12
+ </div>
13
+
14
+
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,12 @@
1
+ <h1>Something went wrong while importing a tradebyte order</h1>
2
+ <br>
3
+ <br>
4
+ <h2>Order:</h2>
5
+ <p><%= @order.inspect %></p>
6
+ <br>
7
+ <br>
8
+ <h2>Message:</h2>
9
+ <p><%= @exception.message %></p>
10
+ <br><br><br>
11
+ <h2>Backtrace:</h2>
12
+ <p><%= @exception.backtrace.join('<br>').html_safe %></p>
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" from the root of your extension
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/spree_tradebyte/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,3 @@
1
+ Spree::Core::Engine.add_routes do
2
+ # Add your extension routes here
3
+ end
@@ -0,0 +1,5 @@
1
+ class AddTradebyteExportedToSpreeOrders < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_orders, :tradebyte_exported, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class AddColumnsToSpreeOrders < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_orders, :tradebyte_id, :integer
4
+ add_column :spree_orders, :tradebyte_channel_id, :string
5
+ add_column :spree_orders, :tradebyte_channel_sign, :string
6
+ add_column :spree_orders, :is_tradebyte_order, :boolean, default: false
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class AddTradebyteIdToSpreeLineItems < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_line_items, :tradebyte_item_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddTradebyteSkuToLineItems < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_line_items, :tradebyte_sku, :string
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddTradebyteFieldsToProducts < ActiveRecord::Migration[5.0]
2
+ def change
3
+ change_table :spree_products do |t|
4
+ t.text :tradebyte_settings
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddTradebyteSettingsToSpreeVariants < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_variants, :tradebyte_settings, :text
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ class CreateShippingMethodsForTradebyte < ActiveRecord::Migration[5.0]
2
+ def change
3
+ @all_zones = Spree::Zone.all
4
+ @default_category = Spree::ShippingCategory.first
5
+
6
+ Spree::ShippingMethod.create(name: 'TB PostNL', code: 'zanl', display_on: :back_end, admin_name: 'POSTNL', calculator_attributes: {type: 'Spree::Calculator::Shipping::FlatRate'}).tap(&method(:add_data))
7
+ Spree::ShippingMethod.create(name: 'TB DHL', code: 'zade amde', display_on: :back_end, admin_name: 'DHL', calculator_attributes: {type: 'Spree::Calculator::Shipping::FlatRate'}).tap(&method(:add_data))
8
+ Spree::ShippingMethod.create(name: 'TB DPD', code: 'bonl bobe', display_on: :back_end, admin_name: 'DPD', calculator_attributes: {type: 'Spree::Calculator::Shipping::FlatRate'}).tap(&method(:add_data))
9
+
10
+ end
11
+
12
+ def add_data(shipping_method)
13
+ shipping_method.zones = @all_zones
14
+ shipping_method.shipping_categories << @default_category
15
+ shipping_method.save
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ class CreatePaymentMethodForTradebyte < ActiveRecord::Migration[5.0]
2
+ def change
3
+ Spree::PaymentMethod.create(type: 'Spree::PaymentMethod::Tradebyte', name: 'TB_PAYMENT', description: 'Paid on tradebyte', active: 1, display_on: :back_end)
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ module SpreeTradebyte
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def self.source_root
7
+ File.dirname(__FILE__) + '/../templates'
8
+ end
9
+
10
+ def copy_initializer_file
11
+ copy_file "./initializer.rb", "config/initializers/spree_tradebyte.rb"
12
+ end
13
+
14
+ def add_migrations
15
+ run 'bundle exec rake railties:install:migrations FROM=spree_tradebyte'
16
+ end
17
+
18
+ def run_migrations
19
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
20
+ if run_migrations
21
+ run 'bundle exec rake db:migrate'
22
+ else
23
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ SpreeTradebyte.configuration do |config|
2
+ # The TradeByte FTP server used for the file exchange
3
+ config.ftp_server = ''
4
+
5
+ # The TradeByte FTP username
6
+ config.ftp_user = ''
7
+
8
+ # The TradeByte FTP password
9
+ config.ftp_password = ''
10
+
11
+ # The TradeByte FTP port
12
+ config.ftp_port = ''
13
+
14
+ # Queue adapter for handling the import and export jobs
15
+ config.active_job_queue_adapter = :async
16
+
17
+ # Admin email to send error notifications
18
+ # ActionMailer needs to be able to send emails for this to work
19
+ config.admin_email = ''
20
+
21
+ # the method to call on the shipping method to determine the TB.ONE parcel type. :code and :admin_name are existing
22
+ # options. Any method can be called though.
23
+ config.parcel_type_method = :admin_name
24
+
25
+ # Which method should be called for the product identifier
26
+ config.product_id_method = :id
27
+
28
+ # The brand communicated to tradebyte for each article
29
+ config.brand_name = ''
30
+
31
+ # The backend host domain
32
+ config.host = ''
33
+
34
+ # The name of the taxonomy used to determine the tradebyte category structure
35
+ config.base_taxonomy = 'tradebyte'
36
+
37
+ # Which channels are active?
38
+ config.channels = %w{bonl bobe zade zanl amde}
39
+
40
+ # Delivery time (ActiveSupport::Duration)
41
+ config.delivery_time = 1.day
42
+ end
@@ -0,0 +1,27 @@
1
+ module SetupConfiguration
2
+
3
+ def configuration
4
+ yield self
5
+ end
6
+
7
+ def define_setting(name, default = nil)
8
+ class_variable_set("@@#{name}", default)
9
+
10
+ define_class_method "#{name}=" do |value|
11
+ class_variable_set("@@#{name}", value)
12
+ end
13
+
14
+ define_class_method name do
15
+ class_variable_get("@@#{name}")
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def define_class_method(name, &block)
22
+ (class << self; self; end).instance_eval do
23
+ define_method name, &block
24
+ end
25
+ end
26
+
27
+ end