workarea-flow_io 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintignore +2 -0
  3. data/.eslintrc.json +37 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  5. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  7. data/.github/workflows/ci.yml +90 -0
  8. data/.gitignore +21 -0
  9. data/.rubocop.yml +2 -0
  10. data/.ruby-version +1 -0
  11. data/.stylelintrc.json +12 -0
  12. data/CHANGELOG.md +200 -0
  13. data/Gemfile +19 -0
  14. data/LICENSE +52 -0
  15. data/README.md +200 -0
  16. data/Rakefile +59 -0
  17. data/app/assets/javascripts/workarea/storefront/flow_io/adapters/flow_io_adapter.js +61 -0
  18. data/app/assets/javascripts/workarea/storefront/flow_io/configuration.js.erb +10 -0
  19. data/app/assets/javascripts/workarea/storefront/flow_io/flow.js +91 -0
  20. data/app/assets/stylesheets/flow_io/storefront/country_picker.scss +189 -0
  21. data/app/controllers/workarea/admin/application_controller.decorator +5 -0
  22. data/app/controllers/workarea/admin/catalog_categories_controller.decorator +9 -0
  23. data/app/controllers/workarea/admin/flow_imports_controller.rb +9 -0
  24. data/app/controllers/workarea/admin/orders_controller.decorator +6 -0
  25. data/app/controllers/workarea/admin/pricing_skus_controller.decorator +7 -0
  26. data/app/controllers/workarea/admin/search_settings_controller.decorator +27 -0
  27. data/app/controllers/workarea/storefront/application_controller.decorator +80 -0
  28. data/app/controllers/workarea/storefront/checkouts_controller.decorator +38 -0
  29. data/app/controllers/workarea/storefront/flow_io_webhook_controller.rb +49 -0
  30. data/app/controllers/workarea/storefront/recent_views_controller.decorator +15 -0
  31. data/app/controllers/workarea/storefront/searches_controller.decorator +11 -0
  32. data/app/helpers/workarea/admin/flow_helper.rb +13 -0
  33. data/app/helpers/workarea/storefront/flow_analytics_helper.rb +23 -0
  34. data/app/helpers/workarea/storefront/flow_content_helper.rb +21 -0
  35. data/app/middleware/workarea/flow_io/session_middleware.rb +68 -0
  36. data/app/models/workarea/address.decorator +12 -0
  37. data/app/models/workarea/catalog/category.decorator +8 -0
  38. data/app/models/workarea/checkout.decorator +26 -0
  39. data/app/models/workarea/flow_io/experience_geo.rb +18 -0
  40. data/app/models/workarea/flow_io/experience_summary.rb +15 -0
  41. data/app/models/workarea/flow_io/import.rb +31 -0
  42. data/app/models/workarea/flow_io/imported_item.rb +124 -0
  43. data/app/models/workarea/flow_io/local_item.rb +28 -0
  44. data/app/models/workarea/flow_io/localized_price.rb +30 -0
  45. data/app/models/workarea/flow_io/price.rb +12 -0
  46. data/app/models/workarea/flow_io/price_with_base.rb +7 -0
  47. data/app/models/workarea/flow_io/webhook/shared_secret.rb +12 -0
  48. data/app/models/workarea/flow_price_adjustment_set.rb +80 -0
  49. data/app/models/workarea/fulfillment.decorator +63 -0
  50. data/app/models/workarea/order.decorator +39 -0
  51. data/app/models/workarea/order/item.decorator +43 -0
  52. data/app/models/workarea/payment.decorator +11 -0
  53. data/app/models/workarea/payment/authorize/flow_payment.rb +48 -0
  54. data/app/models/workarea/payment/capture/flow_payment.rb +35 -0
  55. data/app/models/workarea/payment/flow_payment_data.rb +25 -0
  56. data/app/models/workarea/payment/flow_payment_operation.rb +20 -0
  57. data/app/models/workarea/payment/purchase/flow_payment.rb +44 -0
  58. data/app/models/workarea/payment/refund/flow_payment.rb +42 -0
  59. data/app/models/workarea/payment/store_flow_credit_card.rb +34 -0
  60. data/app/models/workarea/payment/tender.decorator +8 -0
  61. data/app/models/workarea/payment/tender/flow_payment.rb +15 -0
  62. data/app/models/workarea/payment/transaction.decorator +12 -0
  63. data/app/models/workarea/pricing/calculators/flow_localization_calculator.rb +30 -0
  64. data/app/models/workarea/pricing/calculators/item_calculator.decorator +39 -0
  65. data/app/models/workarea/pricing/collection.decorator +113 -0
  66. data/app/models/workarea/pricing/order_totals.decorator +53 -0
  67. data/app/models/workarea/pricing/price.decorator +17 -0
  68. data/app/models/workarea/pricing/price_distributor.decorator +51 -0
  69. data/app/models/workarea/pricing/request.decorator +17 -0
  70. data/app/models/workarea/pricing/shipping_totals.decorator +24 -0
  71. data/app/models/workarea/pricing/sku.decorator +46 -0
  72. data/app/models/workarea/search/settings.decorator +8 -0
  73. data/app/models/workarea/search/storefront/product.decorator +25 -0
  74. data/app/models/workarea/shipping.decorator +28 -0
  75. data/app/queries/workarea/order_metrics.decorator +23 -0
  76. data/app/queries/workarea/search/product_search.decorator +14 -0
  77. data/app/queries/workarea/search/storefront_search/response.decorator +40 -0
  78. data/app/services/workarea/flow_io/checkout.rb +242 -0
  79. data/app/services/workarea/flow_io/checkout_token_form.rb +36 -0
  80. data/app/services/workarea/flow_io/countries.rb +14 -0
  81. data/app/services/workarea/flow_io/detailed_shipping_notification_form.rb +84 -0
  82. data/app/services/workarea/flow_io/experiences.rb +24 -0
  83. data/app/services/workarea/flow_io/fulfillment_cancellation_form.rb +40 -0
  84. data/app/services/workarea/flow_io/item.rb +122 -0
  85. data/app/services/workarea/flow_io/item_importer.rb +108 -0
  86. data/app/services/workarea/flow_io/line_item_form.rb +72 -0
  87. data/app/services/workarea/flow_io/order_put_form.rb +62 -0
  88. data/app/services/workarea/flow_io/price_applier.rb +81 -0
  89. data/app/services/workarea/flow_io/price_applier/item_applier.rb +157 -0
  90. data/app/services/workarea/flow_io/routing_contraints.rb +10 -0
  91. data/app/services/workarea/flow_io/session.rb +90 -0
  92. data/app/services/workarea/flow_io/webhook.rb +28 -0
  93. data/app/services/workarea/flow_io/webhook/experience_deleted_v2.rb +9 -0
  94. data/app/services/workarea/flow_io/webhook/experience_upserted_v2.rb +9 -0
  95. data/app/services/workarea/flow_io/webhook/order_upserted_v2.rb +36 -0
  96. data/app/services/workarea/flow_io/webhook_request_signature.rb +19 -0
  97. data/app/view_models/workarea/admin/flow_imports_view_model.rb +36 -0
  98. data/app/view_models/workarea/storefront/cart_view_model.decorator +27 -0
  99. data/app/view_models/workarea/storefront/content_blocks/category_summary_view_model.decorator +11 -0
  100. data/app/view_models/workarea/storefront/content_blocks/product_insights_view_model.decorator +11 -0
  101. data/app/view_models/workarea/storefront/content_blocks/product_list_view_model.decorator +13 -0
  102. data/app/view_models/workarea/storefront/order_item_view_model.decorator +35 -0
  103. data/app/view_models/workarea/storefront/order_view_model.decorator +51 -0
  104. data/app/view_models/workarea/storefront/product_templates/option_set_view_model.decorator +20 -0
  105. data/app/view_models/workarea/storefront/product_templates/package_view_model.decorator +14 -0
  106. data/app/view_models/workarea/storefront/product_view_model.decorator +15 -0
  107. data/app/view_models/workarea/storefront/product_view_model/cache_key.decorator +7 -0
  108. data/app/view_models/workarea/storefront/recommendations_view_model.decorator +20 -0
  109. data/app/view_models/workarea/storefront/user_activity_view_model.decorator +18 -0
  110. data/app/views/workarea/admin/catalog_categories/edit.html.haml +85 -0
  111. data/app/views/workarea/admin/facets/_price_inputs.html.haml +50 -0
  112. data/app/views/workarea/admin/flow_imports/index.html.haml +44 -0
  113. data/app/views/workarea/admin/orders/_flow.html.haml +22 -0
  114. data/app/views/workarea/admin/orders/_flow_aux_navigation.html.haml +2 -0
  115. data/app/views/workarea/admin/orders/flow.html.haml +109 -0
  116. data/app/views/workarea/admin/orders/tenders/_flow_payment.html.haml +3 -0
  117. data/app/views/workarea/admin/pricing_skus/_cards.html.haml +83 -0
  118. data/app/views/workarea/admin/pricing_skus/flow.html.haml +60 -0
  119. data/app/views/workarea/admin/search_settings/show.html.haml +55 -0
  120. data/app/views/workarea/admin/shared/_flow_imports_link.html.haml +1 -0
  121. data/app/views/workarea/storefront/_flow_io_country_picker.html.haml +2 -0
  122. data/app/views/workarea/storefront/_flow_io_country_picker_javascript.html.haml +1 -0
  123. data/app/views/workarea/storefront/order_mailer/tenders/_flow_payment.html.haml +2 -0
  124. data/app/views/workarea/storefront/order_mailer/tenders/_flow_payment.text.erb +1 -0
  125. data/app/views/workarea/storefront/orders/tenders/_flow_payment.html.haml +3 -0
  126. data/app/views/workarea/storefront/products/_pricing.html.haml +41 -0
  127. data/app/workers/workarea/flow_io/delete_items.rb +30 -0
  128. data/app/workers/workarea/flow_io/fetch_import.rb +34 -0
  129. data/app/workers/workarea/flow_io/fulfillment_cancellation.rb +14 -0
  130. data/app/workers/workarea/flow_io/item_exporter.rb +47 -0
  131. data/app/workers/workarea/flow_io/process_import.rb +28 -0
  132. data/app/workers/workarea/flow_io/shipping_notifications.rb +13 -0
  133. data/bin/rails +25 -0
  134. data/config/initializers/appends.rb +39 -0
  135. data/config/initializers/freedom_patches.rb +23 -0
  136. data/config/initializers/middleware.rb +11 -0
  137. data/config/initializers/payment_proxy.rb +5 -0
  138. data/config/initializers/rack_attack.rb +15 -0
  139. data/config/initializers/scheduled_jobs.rb +9 -0
  140. data/config/initializers/workarea.rb +101 -0
  141. data/config/initializers/workarea_i18n.rb +11 -0
  142. data/config/locales/en.yml +72 -0
  143. data/config/routes.rb +21 -0
  144. data/lib/active_merchant/billing/bogus_flow_gateway.rb +16 -0
  145. data/lib/active_merchant/billing/flow_gateway.rb +48 -0
  146. data/lib/tasks/flow_io.rake +117 -0
  147. data/lib/workarea/flow_io.rb +73 -0
  148. data/lib/workarea/flow_io/bogus_client.rb +57 -0
  149. data/lib/workarea/flow_io/bogus_client/checkout_tokens.rb +25 -0
  150. data/lib/workarea/flow_io/bogus_client/experiences.rb +152 -0
  151. data/lib/workarea/flow_io/bogus_client/fulfillments.rb +9 -0
  152. data/lib/workarea/flow_io/bogus_client/items.rb +11 -0
  153. data/lib/workarea/flow_io/bogus_client/orders.rb +499 -0
  154. data/lib/workarea/flow_io/bogus_client/organizations.rb +42 -0
  155. data/lib/workarea/flow_io/bogus_client/proxy_client.rb +29 -0
  156. data/lib/workarea/flow_io/bogus_client/sessions.rb +115 -0
  157. data/lib/workarea/flow_io/bogus_client/shipping_notifications.rb +10 -0
  158. data/lib/workarea/flow_io/bogus_client/webhook_settings.rb +11 -0
  159. data/lib/workarea/flow_io/bogus_client/webhooks.rb +11 -0
  160. data/lib/workarea/flow_io/controller_log_subscriber.rb +21 -0
  161. data/lib/workarea/flow_io/engine.rb +8 -0
  162. data/lib/workarea/flow_io/http_handler.rb +27 -0
  163. data/lib/workarea/flow_io/version.rb +5 -0
  164. data/lib/workarea/freedom_patches/flow_io.rb +53 -0
  165. data/package.json +9 -0
  166. data/script/admin_ci +9 -0
  167. data/script/ci +11 -0
  168. data/script/core_ci +9 -0
  169. data/script/plugins_ci +9 -0
  170. data/script/storefront_ci +9 -0
  171. data/test/dummy/.ruby-version +1 -0
  172. data/test/dummy/Rakefile +6 -0
  173. data/test/dummy/bin/bundle +3 -0
  174. data/test/dummy/bin/rails +4 -0
  175. data/test/dummy/bin/rake +4 -0
  176. data/test/dummy/bin/setup +28 -0
  177. data/test/dummy/bin/update +28 -0
  178. data/test/dummy/bin/yarn +11 -0
  179. data/test/dummy/config.ru +5 -0
  180. data/test/dummy/config/application.rb +32 -0
  181. data/test/dummy/config/boot.rb +5 -0
  182. data/test/dummy/config/cable.yml +10 -0
  183. data/test/dummy/config/environment.rb +5 -0
  184. data/test/dummy/config/environments/development.rb +52 -0
  185. data/test/dummy/config/environments/production.rb +88 -0
  186. data/test/dummy/config/environments/test.rb +45 -0
  187. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  188. data/test/dummy/config/initializers/assets.rb +14 -0
  189. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  190. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  191. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  192. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  193. data/test/dummy/config/initializers/inflections.rb +16 -0
  194. data/test/dummy/config/initializers/mime_types.rb +4 -0
  195. data/test/dummy/config/initializers/workarea.rb +5 -0
  196. data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
  197. data/test/dummy/config/locales/en.yml +33 -0
  198. data/test/dummy/config/puma.rb +34 -0
  199. data/test/dummy/config/routes.rb +5 -0
  200. data/test/dummy/config/secrets.yml +22 -0
  201. data/test/dummy/config/spring.rb +6 -0
  202. data/test/dummy/db/seeds.rb +2 -0
  203. data/test/dummy/log/.keep +0 -0
  204. data/test/dummy/package.json +5 -0
  205. data/test/factories/workarea/flow_io.rb +136 -0
  206. data/test/factories/workarea/flow_io/euro_order_upserted_payload.rb +581 -0
  207. data/test/fixtures/files/example.csv +14 -0
  208. data/test/integration/workarea/admin/flow_imports_integration_test.rb +20 -0
  209. data/test/integration/workarea/admin/flow_order_integration_test.rb +37 -0
  210. data/test/integration/workarea/admin/search_settings_integration_test.decorator +44 -0
  211. data/test/integration/workarea/flow_locale_integration_test.rb +34 -0
  212. data/test/integration/workarea/storefront/copying_guest_order_integration_test.decorator +113 -0
  213. data/test/integration/workarea/storefront/flow_io_order_redirect_test.rb +55 -0
  214. data/test/integration/workarea/storefront/flow_io_session_integration_test.rb +122 -0
  215. data/test/integration/workarea/storefront/flow_io_webhooks/order_integration_test.rb +750 -0
  216. data/test/integration/workarea/storefront/flow_webhook_rack_attack_integration_test.rb +54 -0
  217. data/test/integration/workarea/storefront/search_integration_test.decorator +51 -0
  218. data/test/javascripts/flow_spec.js +39 -0
  219. data/test/javascripts/spec_helper.js +3 -0
  220. data/test/models/workarea/address_test.decorator +20 -0
  221. data/test/models/workarea/checkout_test.decorator +20 -0
  222. data/test/models/workarea/flow_io/imported_item_test.rb +50 -0
  223. data/test/models/workarea/fulfillment_test.decorator +12 -0
  224. data/test/models/workarea/oms_fulfillment_test.decorator +14 -0
  225. data/test/models/workarea/order/item_test.decorator +46 -0
  226. data/test/models/workarea/order_test.decorator +16 -0
  227. data/test/models/workarea/payment/flow_payment_integration_test.rb +163 -0
  228. data/test/models/workarea/price_adjustment_set_flow_test.rb +8 -0
  229. data/test/models/workarea/pricing/calculators/flow_localization_calculator_test.rb +152 -0
  230. data/test/models/workarea/pricing/calculators/item_calculator_test.decorator +59 -0
  231. data/test/models/workarea/pricing/collection_test.decorator +140 -0
  232. data/test/models/workarea/pricing/order_totals_test.rb +247 -0
  233. data/test/models/workarea/pricing/price_distributor_test.decorator +21 -0
  234. data/test/models/workarea/pricing/sku_test.decorator +113 -0
  235. data/test/models/workarea/shipping_test.decorator +70 -0
  236. data/test/queries/workarea/flow_order_metrics_test.rb +104 -0
  237. data/test/services/workarea/commit_shipments_test.decorator +14 -0
  238. data/test/services/workarea/flow_io/checkout_test.rb +43 -0
  239. data/test/services/workarea/flow_io/detailed_shipping_notification_form_test.rb +145 -0
  240. data/test/services/workarea/flow_io/experiences_test.rb +14 -0
  241. data/test/services/workarea/flow_io/fulfillment_cancellation_form_test.rb +46 -0
  242. data/test/services/workarea/flow_io/item_importer_test.rb +357 -0
  243. data/test/services/workarea/flow_io/item_test.rb +72 -0
  244. data/test/services/workarea/flow_io/line_item_form_test.rb +34 -0
  245. data/test/services/workarea/flow_io/order_put_form_test.rb +48 -0
  246. data/test/services/workarea/flow_io/price_applier_test.rb +916 -0
  247. data/test/support/flow_fixtures.rb +1362 -0
  248. data/test/support/webhook_integration_test.rb +43 -0
  249. data/test/support/workarea/flow_bogus_client_support.rb +18 -0
  250. data/test/support/workarea/flow_io_vcr_config.rb +22 -0
  251. data/test/system/workarea/admin/search_fulfillment_system_test.decorator +25 -0
  252. data/test/system/workarea/storefront/analytics_system_test.decorator +28 -0
  253. data/test/system/workarea/storefront/flow_cart_recommendations_system_test.rb +70 -0
  254. data/test/system/workarea/storefront/users_flow_orders_system_test.rb +25 -0
  255. data/test/teaspoon_env.rb +6 -0
  256. data/test/test_helper.rb +27 -0
  257. data/test/vcr_cassettes/payment/flow/auth_capture.yml +188 -0
  258. data/test/vcr_cassettes/payment/flow/auth_capture_refund.yml +249 -0
  259. data/test/vcr_cassettes/payment/flow/auth_void.yml +188 -0
  260. data/test/vcr_cassettes/payment/flow/purchase_refund.yml +249 -0
  261. data/test/vcr_cassettes/payment/flow/store_auth.yml +127 -0
  262. data/test/vcr_cassettes/payment/flow/store_purchase.yml +188 -0
  263. data/test/view_models/workarea/storefront/cart_view_model_test.decorator +19 -0
  264. data/test/view_models/workarea/storefront/order_item_view_model_test.decorator +24 -0
  265. data/test/view_models/workarea/storefront/order_view_model_test.decorator +41 -0
  266. data/test/view_models/workarea/storefront/package_view_model_test.decorator +11 -0
  267. data/test/workers/workarea/flow_io/delete_items_test.rb +37 -0
  268. data/test/workers/workarea/flow_io/fetch_import_test.rb +41 -0
  269. data/test/workers/workarea/flow_io/item_exporter_test.rb +47 -0
  270. data/test/workers/workarea/flow_io/process_import_test.rb +25 -0
  271. data/workarea-flow_io.gemspec +20 -0
  272. metadata +375 -0
@@ -0,0 +1,42 @@
1
+ module Workarea
2
+ class Payment
3
+ class Refund
4
+ class FlowPayment
5
+ include OperationImplementation
6
+ include FlowPaymentOperation
7
+ include FlowPaymentData
8
+
9
+ def complete!
10
+ validate_reference!
11
+
12
+ transaction.response = handle_active_merchant_errors do
13
+ gateway.refund(
14
+ transaction.amount.to_f,
15
+ nil,
16
+ transaction_options
17
+ )
18
+ end
19
+ end
20
+
21
+ def cancel!
22
+ # noop
23
+ end
24
+
25
+ private
26
+
27
+ def transaction_options
28
+ {
29
+ currency: currency_code,
30
+ authorization_id: authorization
31
+ }
32
+ end
33
+
34
+ def authorization
35
+ response = transaction.reference.response.params["response"]
36
+
37
+ response["authorization"].present? ? response["authorization"]["id"] : response["reference"]
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module Workarea
2
+ class Payment
3
+ class StoreFlowCreditCard
4
+ include FlowPaymentOperation
5
+
6
+ def initialize(credit_card, options = {})
7
+ @credit_card = credit_card
8
+ @options = options
9
+ end
10
+
11
+ def perform!
12
+ return true if @credit_card.token.present?
13
+
14
+ response = handle_active_merchant_errors do
15
+ gateway.store(@credit_card.to_active_merchant)
16
+ end
17
+
18
+ # gateway will return a string if successful and an
19
+ # active merchant error if it fails
20
+ if response.is_a? String
21
+ @credit_card.token = response
22
+ true
23
+ else
24
+ false
25
+ end
26
+ end
27
+
28
+ def save!
29
+ perform!
30
+ @credit_card.save
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ module Workarea
2
+ decorate Payment::Tender, with: :flow_io do
3
+ decorated do
4
+ field :flow_amount, type: Money, default: 0
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,15 @@
1
+ module Workarea
2
+ class Payment
3
+ class Tender
4
+ class FlowPayment < Tender
5
+ field :details, type: Hash
6
+ field :payment_type, type: String
7
+ field :description, type: String
8
+
9
+ def slug
10
+ :flow_payment
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Workarea
2
+ decorate Payment::Transaction, with: :flow_io do
3
+ decorated do
4
+ field :flow_amount, type: Money, default: 0
5
+ end
6
+
7
+ def tender_type
8
+ tender.payment.operation_tender_type || super
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,30 @@
1
+ module Workarea
2
+ module Pricing
3
+ module Calculators
4
+ class FlowLocalizationCalculator
5
+ include Calculator
6
+
7
+ def adjust
8
+ return unless order.experience.present? && order.items.present?
9
+
10
+ order_put_form = FlowIo::OrderPutForm.from(order: order, shippings: shippings, discounts: discounts)
11
+
12
+ flow_order = FlowIo.client.orders.put_by_number(
13
+ FlowIo.organization_id,
14
+ order.id,
15
+ order_put_form,
16
+ experience: order.experience.key
17
+ )
18
+
19
+ FlowIo::PriceApplier.perform(order: order, flow_order: flow_order)
20
+ rescue => exception
21
+ if defined?(::Raven)
22
+ Raven.capture_exception(exception)
23
+ else
24
+ Rails.logger.warn "Error in FlowLocalizationCalculator: #{exception}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ module Workarea
2
+ decorate Pricing::Calculators::ItemCalculator, with: :flow_io do
3
+ def adjust
4
+ return super unless order.experience.present?
5
+
6
+ order.items.each do |item|
7
+ price = pricing.for_sku(item.sku, quantity: item.quantity)
8
+
9
+ item.adjust_pricing(
10
+ price: 'item',
11
+ quantity: item.quantity,
12
+ calculator: self.class.name,
13
+ amount: price.sell * item.quantity,
14
+ description: 'Item Subtotal',
15
+ data: {
16
+ 'on_sale' => price.on_sale?,
17
+ 'original_price' => price.regular.to_f,
18
+ 'tax_code' => price.tax_code
19
+ }
20
+ )
21
+
22
+ local_price = pricing.for_sku(item.sku, quantity: item.quantity, experience: order.experience)
23
+
24
+ item.adjust_flow_pricing(
25
+ price: 'item',
26
+ quantity: item.quantity,
27
+ calculator: self.class.name,
28
+ amount: local_price.sell * item.quantity,
29
+ description: 'Item Subtotal',
30
+ data: {
31
+ 'on_sale' => local_price.on_sale?,
32
+ 'original_price' => local_price.regular.to_f,
33
+ 'tax_code' => local_price.tax_code
34
+ }
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,113 @@
1
+ module Workarea
2
+ decorate Pricing::Collection, with: :flow_io do
3
+ decorated { attr_accessor :flow_experience }
4
+
5
+ def regular_min_price
6
+ return super unless flow_experience.present?
7
+
8
+ @regular_min_price ||= records
9
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).regular }
10
+ .sort
11
+ .first
12
+ end
13
+
14
+ def regular_max_price
15
+ return super unless flow_experience.present?
16
+
17
+ @regular_max_price ||= records
18
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).regular }
19
+ .sort
20
+ .last
21
+ end
22
+
23
+ def sale_min_price
24
+ return super unless flow_experience.present?
25
+
26
+ @sale_min_price ||= records
27
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).sale }
28
+ .compact
29
+ .sort
30
+ .first
31
+ end
32
+
33
+ def sale_max_price
34
+ return super unless flow_experience.present?
35
+
36
+ @sale_max_price ||= records
37
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).sale }
38
+ .compact
39
+ .sort
40
+ .last
41
+ end
42
+
43
+ def sell_min_price
44
+ return super unless flow_experience.present?
45
+
46
+ @sell_min_price ||= records
47
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).sell }
48
+ .sort
49
+ .first
50
+ end
51
+
52
+ def sell_max_price
53
+ return super unless flow_experience.present?
54
+
55
+ @sell_max_price ||= records
56
+ .map { |pricing_sku| pricing_sku.find_price(experience: flow_experience).sell }
57
+ .sort
58
+ .last
59
+ end
60
+
61
+ def msrp_min_price
62
+ return super unless flow_experience.present?
63
+
64
+ @msrp_min_price ||= records
65
+ .map { |pricing_sku| pricing_sku.msrp_for_experience(flow_experience) }
66
+ .compact
67
+ .sort
68
+ .first
69
+ end
70
+
71
+ def msrp_max_price
72
+ return super unless flow_experience.present?
73
+
74
+ @msrp_max_price ||= records
75
+ .map { |pricing_sku| pricing_sku.msrp_for_experience(flow_experience) }
76
+ .compact
77
+ .sort
78
+ .last
79
+ end
80
+
81
+ # All localized selling prices grouped by experience_key
82
+ # eg. { "europe" => [12.4, 34], "canada" => [11.8, 9] }
83
+ #
84
+ # @return [::Hash]
85
+ def localized_selling_prices
86
+ records.each_with_object({}) do |sku, memo|
87
+ sku.flow_io_local_items.each do |local_item|
88
+ memo[local_item.experience.key] ||= []
89
+ memo[local_item.experience.key] << local_item.to_price.sell.to_f
90
+ end
91
+ end
92
+ end
93
+
94
+ # All localized minimum selling pricea grouped by experience_key
95
+ # eg. { "europe" => 12.4, "canada" => 11.8 }
96
+ #
97
+ # @return [::Hash]
98
+ def localized_min_sell_prices
99
+ records.each_with_object({}) do |sku, memo|
100
+ sku.flow_io_local_items.each do |local_item|
101
+ sell_price = local_item.to_price.sell.to_f
102
+ experience_key = local_item.experience.key
103
+
104
+ memo[experience_key] ||= sell_price
105
+
106
+ if sell_price < memo[experience_key]
107
+ memo[experience_key] = sell_price
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,53 @@
1
+ module Workarea
2
+ decorate Pricing::OrderTotals, with: :flow_io do
3
+ def total
4
+ super
5
+
6
+ return unless @order.experience.present?
7
+
8
+ set_flow_item_totals
9
+ set_flow_subtotal
10
+ set_flow_shipping_totals
11
+ set_flow_tax_totals
12
+ set_flow_total
13
+ set_flow_total_value
14
+ end
15
+
16
+ private
17
+
18
+ def flow_price_adjustments
19
+ @flow_price_adjustments ||= @order.flow_price_adjustments +
20
+ @shippings.map(&:flow_price_adjustments).reduce(:+)
21
+ end
22
+
23
+ def set_flow_item_totals
24
+ @order.items.each do |item|
25
+ item.flow_total_value = item.flow_price_adjustments.reject do |adjustment|
26
+ adjustment.price.in?(%w(tax shipping))
27
+ end.sum(&:amount)
28
+
29
+ item.flow_total_price = item.flow_price_adjustments.adjusting('item').sum
30
+ end
31
+ end
32
+
33
+ def set_flow_subtotal
34
+ @order.flow_subtotal_price = flow_price_adjustments.adjusting('item').sum
35
+ end
36
+
37
+ def set_flow_shipping_totals
38
+ @order.flow_shipping_total = flow_price_adjustments.adjusting('shipping').sum
39
+ end
40
+
41
+ def set_flow_tax_totals
42
+ @order.flow_tax_total = flow_price_adjustments.adjusting('tax').sum
43
+ end
44
+
45
+ def set_flow_total
46
+ @order.flow_total_price = flow_price_adjustments.sum
47
+ end
48
+
49
+ def set_flow_total_value
50
+ @order.flow_total_value = @order.flow_total_price - @order.flow_shipping_total - @order.flow_tax_total
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,17 @@
1
+ module Workarea
2
+ decorate Pricing::Price, with: :flow_io do
3
+ decorated do
4
+ before_validation :guard_negative_prices
5
+ end
6
+
7
+ def guard_negative_prices
8
+ if regular < 0
9
+ self.regular = regular.abs
10
+ end
11
+
12
+ if sale.present? && sale < 0
13
+ self.sale = sale.abs
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,51 @@
1
+ module Workarea
2
+ decorate Pricing::PriceDistributor, with: :flow_io do
3
+ class_methods do
4
+ def for_flow_order(price, order)
5
+ units = []
6
+
7
+ order.items.each do |item|
8
+ item.quantity.times do
9
+ units << { id: item.id, price: item.current_flow_unit_price }
10
+ end
11
+ end
12
+
13
+ new(price, units, order.currency)
14
+ end
15
+ end
16
+
17
+ def initialize(total_value, units, currency_code = nil)
18
+ super(total_value, units)
19
+ @currency_code = currency_code
20
+ end
21
+
22
+ private
23
+
24
+ def distributed_results
25
+ tmp = Hash.new(0.to_m(@currency_code))
26
+
27
+ @units.each do |unit|
28
+ next if @total_value.to_f.zero? ||
29
+ unit[:price].to_f.zero? ||
30
+ @total_price.to_f.zero?
31
+
32
+ unit_value = @total_value.to_f *
33
+ (unit[:price].to_f / @total_price.to_f)
34
+
35
+ @total_price -= unit[:price]
36
+ @total_value -= unit_value.to_m(@currency_code)
37
+
38
+ tmp[unit[:id]] += unit_value.to_m(@currency_code)
39
+ end
40
+
41
+ tmp
42
+ end
43
+
44
+ def empty_results
45
+ @units.inject({}) do |memo, unit|
46
+ memo[unit[:id]] ||= 0.to_m(@currency_code)
47
+ memo
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ module Workarea
2
+ decorate Pricing::Request, with: :flow_io do
3
+ private
4
+ def clone_order_attributes
5
+ attributes = @persisted_order.as_document.except('_id','id')
6
+
7
+ if attributes['items'].present?
8
+ attributes['items'].each do |item|
9
+ item['price_adjustments'] = []
10
+ item['flow_price_adjustments'] = []
11
+ end
12
+ end
13
+
14
+ attributes
15
+ end
16
+ end
17
+ end