workarea-mail_chimp 3.0.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.
- checksums.yaml +7 -0
- data/.editorconfig +15 -0
- data/.gitignore +55 -0
- data/.markdownlint.json +10 -0
- data/.rails-rubocop.yml +119 -0
- data/.rubocop.yml +8 -0
- data/.scss-lint.yml +188 -0
- data/CHANGELOG.md +244 -0
- data/Gemfile +9 -0
- data/README.md +115 -0
- data/Rakefile +53 -0
- data/app/assets/javascripts/workarea/storefront/mail_chimp/mail_chimp_tracking.js +15 -0
- data/app/controllers/workarea/storefront/application_controller.decorator +11 -0
- data/app/controllers/workarea/storefront/cart_items_controller.decorator +18 -0
- data/app/controllers/workarea/storefront/checkout/addresses_controller.decorator +13 -0
- data/app/controllers/workarea/storefront/checkout/shipping_controller.decorator +13 -0
- data/app/controllers/workarea/storefront/users/accounts_controller.decorator +37 -0
- data/app/models/workarea/catalog/product.decorator +7 -0
- data/app/models/workarea/mail_chimp/group.rb +39 -0
- data/app/models/workarea/mail_chimp/store.rb +26 -0
- data/app/models/workarea/order.decorator +9 -0
- data/app/models/workarea/user.decorator +31 -0
- data/app/services/workarea/mail_chimp/address.rb +28 -0
- data/app/services/workarea/mail_chimp/cart.rb +78 -0
- data/app/services/workarea/mail_chimp/order.rb +97 -0
- data/app/services/workarea/mail_chimp/product.rb +43 -0
- data/app/services/workarea/mail_chimp/variant.rb +43 -0
- data/app/view_models/workarea/storefront/user_view_model.decorator +16 -0
- data/app/views/workarea/storefront/mail_chimp/_ecommerce_javascript.html.haml +2 -0
- data/app/views/workarea/storefront/users/accounts/_edit.html.haml +12 -0
- data/app/views/workarea/storefront/users/accounts/_email_interests.html.haml +13 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_cart.rb +40 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_order.rb +31 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_product.rb +31 -0
- data/app/workers/workarea/mail_chimp/list_subscriber.rb +30 -0
- data/app/workers/workarea/mail_chimp/list_unsubscriber.rb +22 -0
- data/app/workers/workarea/mail_chimp/subscription_edit.rb +28 -0
- data/bin/rails +19 -0
- data/config/initializers/appends.rb +21 -0
- data/config/initializers/workarea.rb +14 -0
- data/config/locales/en.yml +15 -0
- data/lib/gibbon/request_decorator.rb +10 -0
- data/lib/integrations/workarea/mail_chimp/bogus_api_request.rb +30 -0
- data/lib/integrations/workarea/mail_chimp/bogus_gateway.rb +35 -0
- data/lib/integrations/workarea/mail_chimp/bogus_request.rb +78 -0
- data/lib/integrations/workarea/mail_chimp/gateway.rb +86 -0
- data/lib/integrations/workarea/mail_chimp/gateway/list.rb +47 -0
- data/lib/integrations/workarea/mail_chimp/gateway/members.rb +61 -0
- data/lib/integrations/workarea/mail_chimp/gateway/subscribe_argument_builder.rb +101 -0
- data/lib/tasks/mail_chimp.rake +71 -0
- data/lib/workarea/mail_chimp.rb +72 -0
- data/lib/workarea/mail_chimp/engine.rb +14 -0
- data/lib/workarea/mail_chimp/errors.rb +2 -0
- data/lib/workarea/mail_chimp/tasks/ecommerce.rb +43 -0
- data/lib/workarea/mail_chimp/version.rb +5 -0
- data/script/admin_ci +9 -0
- data/script/ci +11 -0
- data/script/core_ci +9 -0
- data/script/plugins_ci +9 -0
- data/script/storefront_ci +9 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +56 -0
- data/test/dummy/config/environments/production.rb +86 -0
- data/test/dummy/config/environments/test.rb +43 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/factories/mail_chimp.rb +50 -0
- data/test/integration/workarea/mailchimp/subscription_test.rb +52 -0
- data/test/integration/workarea/mailchimp/tracking_params_test.rb +50 -0
- data/test/integration/workarea/mailchimp/unsubscribe_test.rb +14 -0
- data/test/integration/workarea/storefront/mail_chimp_order_test.rb +106 -0
- data/test/integration/workarea/storefront/mail_chimp_product_test.rb +51 -0
- data/test/integration/workarea/storefront/mail_chimp_site_javascript_test.rb +25 -0
- data/test/lib/workarea/mailchimp/gateway/list_test.rb +48 -0
- data/test/lib/workarea/mailchimp/gateway_test.rb +196 -0
- data/test/lib/workarea/mailchimp/tasks/ecommerce_test.rb +40 -0
- data/test/services/workarea/mail_chimp/cart_test.rb +44 -0
- data/test/services/workarea/mail_chimp/order_test.rb +50 -0
- data/test/services/workarea/mail_chimp/product_test.rb +29 -0
- data/test/support/workarea/mail_chimp_api_config.rb +33 -0
- data/test/system/workarea/storefront/campaign_tracking_test.rb +14 -0
- data/test/system/workarea/storefront/group_test.rb +33 -0
- data/test/system/workarea/storefront/mail_chimp_accounts_system_test.rb +79 -0
- data/test/test_helper.rb +17 -0
- data/test/vcr_cassettes/get_default_list_interests.yml +104 -0
- data/test/vcr_cassettes/get_member_details_no_match.yml +51 -0
- data/test/vcr_cassettes/get_member_details_unsubscribed.yml +51 -0
- data/test/vcr_cassettes/interest_categories_read.yml +104 -0
- data/test/vcr_cassettes/mail_chimp/tasks/create_store-successful.yml +97 -0
- data/test/vcr_cassettes/mc_order_test.yml +381 -0
- data/test/vcr_cassettes/mc_product_test.yml +234 -0
- data/test/vcr_cassettes/subscribe_to_default_list.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_interest_groups.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_with_groupings.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_with_user_details.yml +254 -0
- data/test/vcr_cassettes/unsubscribe_from_default_list.yml +53 -0
- data/test/vcr_cassettes/update_member_on_default_list_change_email.yml +254 -0
- data/test/vcr_cassettes/update_member_on_default_list_change_groupings.yml +254 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_cart_test.rb +28 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_order_test.rb +15 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_product_test.rb +15 -0
- data/workarea-mail_chimp.gemspec +20 -0
- metadata +212 -0
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                class Cart
         | 
| 4 | 
            +
                  include Workarea::I18n::DefaultUrlOptions
         | 
| 5 | 
            +
                  include Storefront::Engine.routes.url_helpers
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  attr_reader :order, :options
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def initialize(order, options = {})
         | 
| 10 | 
            +
                    @order = order
         | 
| 11 | 
            +
                    @options = options
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  # @return Hash
         | 
| 15 | 
            +
                  def to_h
         | 
| 16 | 
            +
                    cart_hsh = {
         | 
| 17 | 
            +
                      id: order.id.to_s,
         | 
| 18 | 
            +
                      currency_code: order.total_price.currency.iso_code,
         | 
| 19 | 
            +
                      order_total: order.total_price.to_s,
         | 
| 20 | 
            +
                      tax_total: order.tax_total.to_s,
         | 
| 21 | 
            +
                      shipping_total: order.shipping_total.to_s,
         | 
| 22 | 
            +
                      lines: lines,
         | 
| 23 | 
            +
                      customer: customer,
         | 
| 24 | 
            +
                      checkout_url: Storefront::Engine.routes.url_helpers.resume_cart_url(token: order.token, host: Workarea.config.host),
         | 
| 25 | 
            +
                    }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    # Mailchimp api does not accept empty values for campaign ID
         | 
| 28 | 
            +
                    # only merge in if the campaign ID is present
         | 
| 29 | 
            +
                    cart_hsh.merge!(campaign_id: order.mail_chimp_campaign_id) if order.mail_chimp_campaign_id.present?
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    cart_hsh
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    def customer
         | 
| 37 | 
            +
                      customer = { id: Digest::MD5.hexdigest(order.email) }
         | 
| 38 | 
            +
                      if send_full_customer?
         | 
| 39 | 
            +
                        customer.merge!(
         | 
| 40 | 
            +
                          {
         | 
| 41 | 
            +
                            email_address: order.email,
         | 
| 42 | 
            +
                            opt_in_status: Workarea::Email.signed_up?(order.email),
         | 
| 43 | 
            +
                            first_name: payment.address.first_name,
         | 
| 44 | 
            +
                            last_name:  payment.address.last_name
         | 
| 45 | 
            +
                          }
         | 
| 46 | 
            +
                        )
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                      customer
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    def payment
         | 
| 53 | 
            +
                      @payment ||=  Workarea::Payment.find(order.id)
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    # order items. Mailchimp refers to them as "lines"
         | 
| 57 | 
            +
                    def lines
         | 
| 58 | 
            +
                      order.items.map do |oi|
         | 
| 59 | 
            +
                        {
         | 
| 60 | 
            +
                          id: oi.id.to_s,
         | 
| 61 | 
            +
                          product_id: oi.product_id,
         | 
| 62 | 
            +
                          product_variant_id: oi.sku,
         | 
| 63 | 
            +
                          quantity: oi.quantity,
         | 
| 64 | 
            +
                          price: oi.total_price.to_s
         | 
| 65 | 
            +
                        }
         | 
| 66 | 
            +
                      end
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    def payment
         | 
| 70 | 
            +
                      @payment ||=  Workarea::Payment.find(order.id)
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    def send_full_customer?
         | 
| 74 | 
            +
                      options[:send_full_customer]
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
            end
         | 
| @@ -0,0 +1,97 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                class Order
         | 
| 4 | 
            +
                  attr_reader :order, :options
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(order, options = {})
         | 
| 7 | 
            +
                    @order = order
         | 
| 8 | 
            +
                    @options = options
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  # @return Hash
         | 
| 12 | 
            +
                  def to_h
         | 
| 13 | 
            +
                    order_hsh = {
         | 
| 14 | 
            +
                      id: order.id.to_s,
         | 
| 15 | 
            +
                      financial_status: financial_status,
         | 
| 16 | 
            +
                      fulfillment_status: fulfillment_status,
         | 
| 17 | 
            +
                      currency_code: order.total_price.currency.iso_code,
         | 
| 18 | 
            +
                      order_total: order.total_price.to_s,
         | 
| 19 | 
            +
                      tax_total: order.tax_total.to_s,
         | 
| 20 | 
            +
                      shipping_total: order.shipping_total.to_s,
         | 
| 21 | 
            +
                      processed_at_foreign: order.placed_at.strftime('%FT%T%:z'),
         | 
| 22 | 
            +
                      shipping_address: shipping_address,
         | 
| 23 | 
            +
                      billing_address: billing_address,
         | 
| 24 | 
            +
                      lines: lines,
         | 
| 25 | 
            +
                      customer: customer
         | 
| 26 | 
            +
                    }
         | 
| 27 | 
            +
                    order_hsh.merge!(campaign_id: order.mail_chimp_campaign_id) if order.mail_chimp_campaign_id.present?
         | 
| 28 | 
            +
                    order_hsh
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  private
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    def customer
         | 
| 34 | 
            +
                      {
         | 
| 35 | 
            +
                        id: Digest::MD5.hexdigest(order.email),
         | 
| 36 | 
            +
                        email_address: order.email,
         | 
| 37 | 
            +
                        opt_in_status: Workarea::Email.signed_up?(order.email),
         | 
| 38 | 
            +
                        orders_count: user_order_count,
         | 
| 39 | 
            +
                        total_spent: user_order_total.to_s,
         | 
| 40 | 
            +
                        first_name: payment.address.first_name,
         | 
| 41 | 
            +
                        last_name:  payment.address.last_name
         | 
| 42 | 
            +
                      }
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    def user_order_count
         | 
| 46 | 
            +
                      user_orders.count
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    def user_order_total
         | 
| 50 | 
            +
                      user_orders.map(&:total_price).sum
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    def user_orders
         | 
| 54 | 
            +
                      @user_orders ||= Workarea::Order.placed.where(email: order.email)
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    def shipping_address
         | 
| 58 | 
            +
                      return unless shipping.present?
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                      MailChimp::Address.new(shipping.address).to_h
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    def billing_address
         | 
| 64 | 
            +
                      MailChimp::Address.new(payment.address).to_h
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    def financial_status
         | 
| 68 | 
            +
                      options[:financial_status] || ""
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    def fulfillment_status
         | 
| 72 | 
            +
                      options[:fulfillment_status] || ""
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    # order items. Mailchimp refers to them as "lines"
         | 
| 76 | 
            +
                    def lines
         | 
| 77 | 
            +
                      order.items.map do |oi|
         | 
| 78 | 
            +
                        {
         | 
| 79 | 
            +
                          id: oi.id.to_s,
         | 
| 80 | 
            +
                          product_id: oi.product_id,
         | 
| 81 | 
            +
                          product_variant_id: oi.sku,
         | 
| 82 | 
            +
                          quantity: oi.quantity,
         | 
| 83 | 
            +
                          price: oi.total_price.to_s
         | 
| 84 | 
            +
                        }
         | 
| 85 | 
            +
                      end
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    def payment
         | 
| 89 | 
            +
                      @payment ||=  Workarea::Payment.find(order.id)
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                    def shipping
         | 
| 93 | 
            +
                      @shipping ||= Workarea::Shipping.find_by_order(order.id)
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
            end
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                class Product
         | 
| 4 | 
            +
                  include ActionView::Helpers::AssetUrlHelper
         | 
| 5 | 
            +
                  include Core::Engine.routes.url_helpers
         | 
| 6 | 
            +
                  include Storefront::Engine.routes.url_helpers
         | 
| 7 | 
            +
                  include Workarea::ApplicationHelper
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  attr_reader :product
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize(product)
         | 
| 12 | 
            +
                    @product = product
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  # @return Hash
         | 
| 16 | 
            +
                  def to_h
         | 
| 17 | 
            +
                    {
         | 
| 18 | 
            +
                      id: product.id.to_s,
         | 
| 19 | 
            +
                      title: product.name,
         | 
| 20 | 
            +
                      handle: product.slug,
         | 
| 21 | 
            +
                      url:  product_url(id: product.to_param, host: Workarea.config.host),
         | 
| 22 | 
            +
                      description: product.description.to_s,
         | 
| 23 | 
            +
                      image_url: primary_image,
         | 
| 24 | 
            +
                      variants: variants
         | 
| 25 | 
            +
                    }
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  private
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def variants
         | 
| 31 | 
            +
                      @variants ||= product.variants.map{ |v| Variant.new(v).to_h }
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def primary_image
         | 
| 35 | 
            +
                      Workarea.config.host + ProductPrimaryImageUrl.new(product).path
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def mounted_core
         | 
| 39 | 
            +
                      self
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                class Variant
         | 
| 4 | 
            +
                  include ActionView::Helpers::AssetUrlHelper
         | 
| 5 | 
            +
                  include Core::Engine.routes.url_helpers
         | 
| 6 | 
            +
                  include Workarea::ApplicationHelper
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  delegate :sku, to: :variant
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  attr_reader :variant
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def initialize(variant)
         | 
| 13 | 
            +
                    @variant = variant
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  # @return Hash
         | 
| 17 | 
            +
                  def to_h
         | 
| 18 | 
            +
                    {
         | 
| 19 | 
            +
                      id: sku,
         | 
| 20 | 
            +
                      title: variant.name,
         | 
| 21 | 
            +
                      sku: sku,
         | 
| 22 | 
            +
                      price: price.to_s,
         | 
| 23 | 
            +
                      inventory_quantity: inventory_sku.available_to_sell,
         | 
| 24 | 
            +
                      visibility: inventory_sku.displayable?.to_s
         | 
| 25 | 
            +
                    }
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  private
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def inventory_sku
         | 
| 31 | 
            +
                    @inventory_sku ||= Inventory::Sku.find(sku) rescue Inventory::Sku.new(id: sku)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def pricing_sku
         | 
| 35 | 
            +
                    @pricing_sku ||= Pricing::Sku.find(sku) rescue Pricing::Sku.new(id: sku)
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def price
         | 
| 39 | 
            +
                    pricing_sku.sell_price.dollars.to_f
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              decorate Storefront::UserViewModel, with: :mail_chimp do
         | 
| 3 | 
            +
                def has_email_interest?(interest)
         | 
| 4 | 
            +
                  return false if model.groups.empty?
         | 
| 5 | 
            +
                  email_interests.find { |id, int| int == interest }
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def email_interests
         | 
| 9 | 
            +
                  model.groups.map(&:interests).inject(&:merge)
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def email_signup?
         | 
| 13 | 
            +
                  model.email_signup || super
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            .email-interest-group
         | 
| 2 | 
            +
            - if @email_interests.present?
         | 
| 3 | 
            +
              %p.email-interest-group__heading= t('workarea.storefront.users.edit.email_interests')
         | 
| 4 | 
            +
              - @email_interests.each do |group|
         | 
| 5 | 
            +
                %p.email-interest-group__sub-heading= group["name"]
         | 
| 6 | 
            +
                - group.interests.each do |id, interest|
         | 
| 7 | 
            +
                  .button-property
         | 
| 8 | 
            +
                    .value= check_box_tag "groups[][interests][#{id}]", interest, @user.has_email_interest?(interest)
         | 
| 9 | 
            +
                    = label_tag "groups[][interests][#{id}]", nil, class: 'button-property__name' do
         | 
| 10 | 
            +
                      %span.text= interest
         | 
| 11 | 
            +
                = hidden_field_tag 'groups[][id]', group._id if group._id.present?
         | 
| 12 | 
            +
                = hidden_field_tag 'groups[][name]', group.name if group.name.present?
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            %tr
         | 
| 2 | 
            +
              %th
         | 
| 3 | 
            +
                %span= t('workarea.storefront.users.email_preferences.interests')
         | 
| 4 | 
            +
              %td
         | 
| 5 | 
            +
                - if @user.email_interests.present?
         | 
| 6 | 
            +
                  %ul.inline-list
         | 
| 7 | 
            +
                    - @user.email_interests.each.with_index(1) do |(_id, interest), index|
         | 
| 8 | 
            +
                      %li<
         | 
| 9 | 
            +
                        #{interest}
         | 
| 10 | 
            +
                        - if index != @user.email_interests.size
         | 
| 11 | 
            +
                          ,
         | 
| 12 | 
            +
                - else
         | 
| 13 | 
            +
                  %p= t('workarea.storefront.users.email_preferences.none')
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                module Ecommerce
         | 
| 4 | 
            +
                  class SaveCart
         | 
| 5 | 
            +
                    include Sidekiq::Worker
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                    def perform(id, options = {})
         | 
| 8 | 
            +
                      order = Workarea::Order.find(id)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                      return if order.placed?
         | 
| 11 | 
            +
                      return if order.email.blank?
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      store_id = Workarea::MailChimp.config.default_store[:id]
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      customer_id = Digest::MD5.hexdigest(order.email)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                      # see if customer exists already
         | 
| 18 | 
            +
                      # existing customers only need to send the ID ot mailchimp
         | 
| 19 | 
            +
                      customer = MailChimp.request.ecommerce.stores(store_id).customers(customer_id).retrieve rescue nil
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                      cart_options = { send_full_customer: customer.blank? }
         | 
| 22 | 
            +
                      mc_cart = Workarea::MailChimp::Cart.new(order, cart_options)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      if order.cart_exported_to_mail_chimp_at.present?
         | 
| 25 | 
            +
                        MailChimp.request.ecommerce.stores(store_id).carts(order.id.to_s).update(body: mc_cart.to_h)
         | 
| 26 | 
            +
                      else
         | 
| 27 | 
            +
                        MailChimp.request.ecommerce.stores(store_id).carts.create(body: mc_cart.to_h)
         | 
| 28 | 
            +
                      end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                      # cart lines in mail chimp need to be removed outside of the delete or update methods.
         | 
| 31 | 
            +
                      if options["deleted_item_id"].present?
         | 
| 32 | 
            +
                        MailChimp.request.ecommerce.stores(store_id).carts(order.id.to_s).lines(options["deleted_item_id"]).delete
         | 
| 33 | 
            +
                      end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      order.set(cart_exported_to_mail_chimp_at: Time.current)
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                module Ecommerce
         | 
| 4 | 
            +
                  class SaveOrder
         | 
| 5 | 
            +
                    include Sidekiq::Worker
         | 
| 6 | 
            +
                    include Sidekiq::CallbacksWorker
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    sidekiq_options(
         | 
| 9 | 
            +
                      enqueue_on: { Workarea::Order => [:place] },
         | 
| 10 | 
            +
                      unique: :until_executing
         | 
| 11 | 
            +
                    )
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def perform(id)
         | 
| 14 | 
            +
                      order = Workarea::Order.find(id)
         | 
| 15 | 
            +
                      mc_order = Workarea::MailChimp::Order.new(order)
         | 
| 16 | 
            +
                      store_id = Workarea::MailChimp.config.default_store[:id]
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      MailChimp.request.ecommerce.stores(store_id).orders.create(body: mc_order.to_h)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                      order.set(exported_to_mail_chimp_at: Time.current)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      delete_cart(id, store_id)
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    def delete_cart(id, store_id)
         | 
| 26 | 
            +
                      MailChimp.request.ecommerce.stores(store_id).carts(id).delete rescue nil
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                module Ecommerce
         | 
| 4 | 
            +
                  class SaveProduct
         | 
| 5 | 
            +
                    include Sidekiq::Worker
         | 
| 6 | 
            +
                    include Sidekiq::CallbacksWorker
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    sidekiq_options(
         | 
| 9 | 
            +
                      enqueue_on: { Catalog::Product => [:save] },
         | 
| 10 | 
            +
                      unique: :until_executing
         | 
| 11 | 
            +
                    )
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def perform(id)
         | 
| 14 | 
            +
                      product = Workarea::Catalog::Product.find(id)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                      mc_product = Workarea::MailChimp::Product.new(product)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      store_id = Workarea::MailChimp.config.default_store[:id]
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                      if product.exported_to_mail_chimp_at.present?
         | 
| 21 | 
            +
                        MailChimp.request.ecommerce.stores(store_id).products(product.id.to_s).update(body: mc_product.to_h)
         | 
| 22 | 
            +
                      else
         | 
| 23 | 
            +
                        MailChimp.request.ecommerce.stores(store_id).products.create(body: mc_product.to_h)
         | 
| 24 | 
            +
                      end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      product.set(exported_to_mail_chimp_at: Time.current)
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module Workarea
         | 
| 2 | 
            +
              module MailChimp
         | 
| 3 | 
            +
                class ListSubscriber
         | 
| 4 | 
            +
                  include Sidekiq::Worker
         | 
| 5 | 
            +
                  include Sidekiq::CallbacksWorker
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  sidekiq_options(
         | 
| 8 | 
            +
                    enqueue_on: { Email::Signup => [:save] },
         | 
| 9 | 
            +
                    queue: "low",
         | 
| 10 | 
            +
                    retry: true
         | 
| 11 | 
            +
                  )
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def perform(email_signup_id)
         | 
| 14 | 
            +
                    signup = Email::Signup.find(email_signup_id)
         | 
| 15 | 
            +
                    @user = User.find_by(email: signup.email) rescue nil
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    if @user
         | 
| 18 | 
            +
                      Workarea::MailChimp.gateway.subscribe(@user.email, user: @user)
         | 
| 19 | 
            +
                      update_user_subscription
         | 
| 20 | 
            +
                    else
         | 
| 21 | 
            +
                      Workarea::MailChimp.gateway.subscribe(signup.email)
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def update_user_subscription
         | 
| 26 | 
            +
                    @user.update_attributes(email_signup: true)
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         |