workarea-global_e 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 (232) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintrc.json +37 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  4. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/workflows/ci.yml +77 -0
  7. data/.gitignore +20 -0
  8. data/.rubocop.yml +2 -0
  9. data/.ruby-version +1 -0
  10. data/CHANGELOG.md +261 -0
  11. data/Gemfile +16 -0
  12. data/README.md +39 -0
  13. data/Rakefile +59 -0
  14. data/app/assets/javascripts/workarea/storefront/global_e/modules/checkout_info_validator.js +122 -0
  15. data/app/assets/javascripts/workarea/storefront/global_e/modules/suppress_price_ranges.js +19 -0
  16. data/app/controllers/workarea/admin/country_exceptions_controller.rb +67 -0
  17. data/app/controllers/workarea/admin/fixed_prices_controller.rb +89 -0
  18. data/app/controllers/workarea/admin/orders_controller.decorator +6 -0
  19. data/app/controllers/workarea/storefront/application_controller.decorator +30 -0
  20. data/app/controllers/workarea/storefront/checkouts_controller.decorator +22 -0
  21. data/app/controllers/workarea/storefront/ge_checkouts_controller.rb +10 -0
  22. data/app/controllers/workarea/storefront/global_e_controller.rb +42 -0
  23. data/app/controllers/workarea/storefront/globale/api_controller.rb +108 -0
  24. data/app/controllers/workarea/storefront/globale/refund_controller.rb +65 -0
  25. data/app/controllers/workarea/storefront/users/logins_controller.decorator +13 -0
  26. data/app/helpers/workarea/admin/global_e_helpers.rb +28 -0
  27. data/app/models/workarea/address.decorator +11 -0
  28. data/app/models/workarea/catalog/product.decorator +14 -0
  29. data/app/models/workarea/fulfillment/status/partially_refunded.rb +13 -0
  30. data/app/models/workarea/fulfillment/status/refunded.rb +15 -0
  31. data/app/models/workarea/fulfillment.decorator +55 -0
  32. data/app/models/workarea/global_e/country_exception.rb +37 -0
  33. data/app/models/workarea/global_e/fixed_price.rb +93 -0
  34. data/app/models/workarea/global_e/order_api_events.rb +29 -0
  35. data/app/models/workarea/order/item.decorator +46 -0
  36. data/app/models/workarea/order/status/pending_global_e_fraud_check.rb +12 -0
  37. data/app/models/workarea/order.decorator +64 -0
  38. data/app/models/workarea/payment/status/global_e_appoved.rb +9 -0
  39. data/app/models/workarea/payment/status/pending_global_e_fraud_check.rb +9 -0
  40. data/app/models/workarea/payment/tender/global_e_payment.rb +16 -0
  41. data/app/models/workarea/payment.decorator +10 -0
  42. data/app/models/workarea/price_adjustment.decorator +13 -0
  43. data/app/models/workarea/price_adjustment_set.decorator +25 -0
  44. data/app/models/workarea/pricing/calculators/item_calculator.decorator +48 -0
  45. data/app/models/workarea/pricing/collection.decorator +90 -0
  46. data/app/models/workarea/pricing/discount/appliation_group.decorator +16 -0
  47. data/app/models/workarea/pricing/discount/international_item_proxy.rb +27 -0
  48. data/app/models/workarea/pricing/discount/international_order.rb +29 -0
  49. data/app/models/workarea/pricing/discount.decorator +65 -0
  50. data/app/models/workarea/pricing/price_distributor.decorator +37 -0
  51. data/app/models/workarea/pricing/request.decorator +17 -0
  52. data/app/models/workarea/pricing/sku.decorator +17 -0
  53. data/app/models/workarea/search/admin/order.decorator +11 -0
  54. data/app/models/workarea/shipping/sku.decorator +23 -0
  55. data/app/models/workarea/shipping.decorator +11 -0
  56. data/app/models/workarea/user.decorator +10 -0
  57. data/app/seeds/workarea/global_e_seeds.rb +66 -0
  58. data/app/services/workarea/create_fulfillment.decorator +12 -0
  59. data/app/services/workarea/global_e/address_details.rb +218 -0
  60. data/app/services/workarea/global_e/api/notify_order_refunded.rb +45 -0
  61. data/app/services/workarea/global_e/api/perform_order_payment.rb +46 -0
  62. data/app/services/workarea/global_e/api/remove_restricted_products.rb +28 -0
  63. data/app/services/workarea/global_e/api/send_order_to_merchant/item_pricer.rb +147 -0
  64. data/app/services/workarea/global_e/api/send_order_to_merchant/save_user.rb +59 -0
  65. data/app/services/workarea/global_e/api/send_order_to_merchant.rb +359 -0
  66. data/app/services/workarea/global_e/api/update_order_shipping_info.rb +38 -0
  67. data/app/services/workarea/global_e/api/update_order_status/canceled.rb +42 -0
  68. data/app/services/workarea/global_e/api/update_order_status.rb +28 -0
  69. data/app/services/workarea/global_e/attribute.rb +44 -0
  70. data/app/services/workarea/global_e/brand.rb +19 -0
  71. data/app/services/workarea/global_e/cart_user_details.rb +34 -0
  72. data/app/services/workarea/global_e/category.rb +19 -0
  73. data/app/services/workarea/global_e/checkout_cart_info.rb +358 -0
  74. data/app/services/workarea/global_e/custom_product_attribute.rb +19 -0
  75. data/app/services/workarea/global_e/discount.rb +215 -0
  76. data/app/services/workarea/global_e/merchant/brand.rb +21 -0
  77. data/app/services/workarea/global_e/merchant/category.rb +21 -0
  78. data/app/services/workarea/global_e/merchant/customer.rb +36 -0
  79. data/app/services/workarea/global_e/merchant/customer_details.rb +201 -0
  80. data/app/services/workarea/global_e/merchant/discount.rb +127 -0
  81. data/app/services/workarea/global_e/merchant/international_details.rb +296 -0
  82. data/app/services/workarea/global_e/merchant/order.rb +425 -0
  83. data/app/services/workarea/global_e/merchant/order_refund.rb +103 -0
  84. data/app/services/workarea/global_e/merchant/original_order.rb +28 -0
  85. data/app/services/workarea/global_e/merchant/parcel_tracking.rb +31 -0
  86. data/app/services/workarea/global_e/merchant/payment_details.rb +161 -0
  87. data/app/services/workarea/global_e/merchant/product.rb +222 -0
  88. data/app/services/workarea/global_e/merchant/refund_product.rb +69 -0
  89. data/app/services/workarea/global_e/merchant/response_info.rb +115 -0
  90. data/app/services/workarea/global_e/merchant_cart_product_attribute.rb +21 -0
  91. data/app/services/workarea/global_e/order_status.rb +20 -0
  92. data/app/services/workarea/global_e/order_status_details.rb +79 -0
  93. data/app/services/workarea/global_e/order_status_reason.rb +20 -0
  94. data/app/services/workarea/global_e/parcel.rb +53 -0
  95. data/app/services/workarea/global_e/product.rb +612 -0
  96. data/app/services/workarea/global_e/product_meta_data.rb +13 -0
  97. data/app/services/workarea/global_e/tracking_details.rb +23 -0
  98. data/app/services/workarea/global_e/update_order_dispatch_exception.rb +46 -0
  99. data/app/services/workarea/global_e/update_order_dispatch_request.rb +108 -0
  100. data/app/services/workarea/global_e/user_id_number_type.rb +21 -0
  101. data/app/services/workarea/global_e/users_details.rb +151 -0
  102. data/app/services/workarea/global_e/vat_category.rb +20 -0
  103. data/app/services/workarea/global_e/vat_rate_type.rb +27 -0
  104. data/app/services/workarea/save_order_analytics.decorator +18 -0
  105. data/app/view_models/workarea/admin/order_view_model.decorator +13 -0
  106. data/app/view_models/workarea/storefront/cart_view_model.decorator +7 -0
  107. data/app/view_models/workarea/storefront/order_item_view_model.decorator +16 -0
  108. data/app/view_models/workarea/storefront/order_view_model.decorator +45 -0
  109. data/app/view_models/workarea/storefront/product_view_model.decorator +35 -0
  110. data/app/views/workarea/admin/catalog_products/_country_exceptions_card.html.haml +31 -0
  111. data/app/views/workarea/admin/catalog_products/_global_e_attributes.html.haml +3 -0
  112. data/app/views/workarea/admin/catalog_products/_global_e_fields.html.haml +4 -0
  113. data/app/views/workarea/admin/country_exceptions/edit.html.haml +48 -0
  114. data/app/views/workarea/admin/country_exceptions/index.html.haml +47 -0
  115. data/app/views/workarea/admin/country_exceptions/new.html.haml +44 -0
  116. data/app/views/workarea/admin/fixed_prices/edit.html.haml +73 -0
  117. data/app/views/workarea/admin/fixed_prices/index.html.haml +55 -0
  118. data/app/views/workarea/admin/fixed_prices/new.html.haml +70 -0
  119. data/app/views/workarea/admin/orders/_global_e.html.haml +27 -0
  120. data/app/views/workarea/admin/orders/attributes.html.haml +131 -0
  121. data/app/views/workarea/admin/orders/global_e.html.haml +110 -0
  122. data/app/views/workarea/admin/orders/show.html.haml +27 -0
  123. data/app/views/workarea/admin/orders/tenders/_global_e_payment.html.haml +3 -0
  124. data/app/views/workarea/admin/pricing_skus/_cards.html.haml +98 -0
  125. data/app/views/workarea/storefront/cart_items/create.html.haml +71 -0
  126. data/app/views/workarea/storefront/carts/_pricing.html.haml +14 -0
  127. data/app/views/workarea/storefront/carts/show.html.haml +187 -0
  128. data/app/views/workarea/storefront/ge_checkouts/show.html.haml +1 -0
  129. data/app/views/workarea/storefront/global_e/_country_picker.html.haml +1 -0
  130. data/app/views/workarea/storefront/global_e/_head.html.haml +10 -0
  131. data/app/views/workarea/storefront/orders/_summary.html.haml +275 -0
  132. data/app/views/workarea/storefront/orders/tenders/_global_e_payment.html.haml +3 -0
  133. data/app/views/workarea/storefront/products/_pricing.html.haml +49 -0
  134. data/app/views/workarea/storefront/products/_restricted_item_text.html.haml +1 -0
  135. data/app/views/workarea/storefront/users/orders/_summary.html.haml +22 -0
  136. data/app/workers/workarea/global_e/update_order_dispatch.rb +28 -0
  137. data/app/workers/workarea/save_user_order_details.decorator +9 -0
  138. data/bin/rails +25 -0
  139. data/config/initializers/appends.rb +46 -0
  140. data/config/initializers/seeds.rb +1 -0
  141. data/config/initializers/workarea.rb +64 -0
  142. data/config/locales/en.yml +105 -0
  143. data/config/routes.rb +31 -0
  144. data/lib/workarea/global_e/engine.rb +10 -0
  145. data/lib/workarea/global_e/error.rb +8 -0
  146. data/lib/workarea/global_e/version.rb +5 -0
  147. data/lib/workarea/global_e.rb +58 -0
  148. data/script/admin_ci +5 -0
  149. data/script/ci +8 -0
  150. data/script/core_ci +5 -0
  151. data/script/plugins_ci +5 -0
  152. data/script/storefront_ci +5 -0
  153. data/test/dummy/.ruby-version +1 -0
  154. data/test/dummy/Rakefile +6 -0
  155. data/test/dummy/app/assets/config/manifest.js +3 -0
  156. data/test/dummy/app/assets/images/.keep +0 -0
  157. data/test/dummy/app/assets/javascripts/application.js +14 -0
  158. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  159. data/test/dummy/app/controllers/application_controller.rb +2 -0
  160. data/test/dummy/app/controllers/concerns/.keep +0 -0
  161. data/test/dummy/app/helpers/application_helper.rb +2 -0
  162. data/test/dummy/app/jobs/application_job.rb +2 -0
  163. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  164. data/test/dummy/app/models/concerns/.keep +0 -0
  165. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  166. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  167. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  168. data/test/dummy/bin/bundle +3 -0
  169. data/test/dummy/bin/rails +4 -0
  170. data/test/dummy/bin/rake +4 -0
  171. data/test/dummy/bin/setup +28 -0
  172. data/test/dummy/bin/update +28 -0
  173. data/test/dummy/bin/yarn +11 -0
  174. data/test/dummy/config/application.rb +23 -0
  175. data/test/dummy/config/boot.rb +5 -0
  176. data/test/dummy/config/environment.rb +5 -0
  177. data/test/dummy/config/environments/development.rb +52 -0
  178. data/test/dummy/config/environments/production.rb +83 -0
  179. data/test/dummy/config/environments/test.rb +45 -0
  180. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  181. data/test/dummy/config/initializers/assets.rb +14 -0
  182. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  183. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  184. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  185. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  186. data/test/dummy/config/initializers/inflections.rb +16 -0
  187. data/test/dummy/config/initializers/mime_types.rb +4 -0
  188. data/test/dummy/config/initializers/workarea.rb +5 -0
  189. data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
  190. data/test/dummy/config/locales/en.yml +33 -0
  191. data/test/dummy/config/puma.rb +34 -0
  192. data/test/dummy/config/routes.rb +5 -0
  193. data/test/dummy/config/secrets.yml +18 -0
  194. data/test/dummy/config/spring.rb +6 -0
  195. data/test/dummy/config.ru +5 -0
  196. data/test/dummy/db/seeds.rb +2 -0
  197. data/test/dummy/lib/assets/.keep +0 -0
  198. data/test/dummy/log/.keep +0 -0
  199. data/test/factories/workarea/global_e_factories.rb +836 -0
  200. data/test/integration/workarea/admin/catalog_product_country_exceptions_integration_test.rb +81 -0
  201. data/test/integration/workarea/admin/global_e_jump_to_integration_test.rb +20 -0
  202. data/test/integration/workarea/admin/pricing_sku_fixed_prices_integration_test.rb +83 -0
  203. data/test/integration/workarea/storefront/global_e_api/receive_order_integration_test.rb +278 -0
  204. data/test/integration/workarea/storefront/global_e_api/receive_order_refund_integration_test.rb +25 -0
  205. data/test/integration/workarea/storefront/global_e_api/receive_payment_integration_test.rb +34 -0
  206. data/test/integration/workarea/storefront/global_e_api/receive_shipping_info_integration_test.rb +29 -0
  207. data/test/integration/workarea/storefront/global_e_api/remove_restricted_products_integration_test.rb +27 -0
  208. data/test/integration/workarea/storefront/global_e_api/update_order_status_integration_test.rb +29 -0
  209. data/test/integration/workarea/storefront/global_e_checkout_cart_info/fixed_pricing_test.rb +438 -0
  210. data/test/integration/workarea/storefront/global_e_checkout_cart_info/gift_card_test.rb +63 -0
  211. data/test/integration/workarea/storefront/global_e_checkout_cart_info_integration_test.rb +660 -0
  212. data/test/integration/workarea/storefront/global_e_checkouts_integration_test.rb +71 -0
  213. data/test/integration/workarea/storefront/users/global_e_logins_integration_test.rb +20 -0
  214. data/test/models/workarea/catalog/product_global_e_test.rb +13 -0
  215. data/test/models/workarea/fixed_pricing_test.rb +117 -0
  216. data/test/models/workarea/global_e/country_exception_test.rb +36 -0
  217. data/test/models/workarea/payment_test.decorator +31 -0
  218. data/test/models/workarea/pricing/calculators/item_calculator_fixed_prices_test.rb +83 -0
  219. data/test/models/workarea/pricing/collection_fixed_prices_test.rb +83 -0
  220. data/test/models/workarea/pricing/price_distributor_test.decorator +21 -0
  221. data/test/models/workarea/pricing/sku_fixed_price_test.rb +133 -0
  222. data/test/support/workarea/global_e_support.rb +18 -0
  223. data/test/system/workarea/admin/global_e_system_test.rb +21 -0
  224. data/test/system/workarea/storefront/global_e_cart_system_test.rb +48 -0
  225. data/test/system/workarea/storefront/global_e_order_history_system_test.rb +43 -0
  226. data/test/teaspoon_env.rb +6 -0
  227. data/test/test_helper.rb +9 -0
  228. data/test/view_models/workarea/admin/global_e_order_view_model_test.rb +22 -0
  229. data/test/workers/workarea/global_e/update_order_dispatch_test.rb +64 -0
  230. data/test/workers/workarea/global_e_save_user_order_details_test.rb +41 -0
  231. data/workarea-global_e.gemspec +16 -0
  232. metadata +293 -0
@@ -0,0 +1,46 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class UpdateOrderDispatchException
4
+ # Identifier of the cart item on the Merchant’s site. This property may
5
+ # be optionally specified in SendCart method only, so that the same value
6
+ # could be posted back when creating the order on the Merchant’s site
7
+ # with SendOrderToMerchant method.
8
+ # NOTE either CartItemId or ProductCode should be specified.
9
+ # This property is mandatory only if ProductCode property has not been specified.
10
+ #
11
+ # @return [String]
12
+ #
13
+ def cart_item_id
14
+ end
15
+
16
+ # Product unique identifier on the Merchant’s site.
17
+ # NOTE either CartItemId or ProductCode should be specified.
18
+ # This property is mandatory only if CartItemId property has not been specified.
19
+ #
20
+ # @return [String]
21
+ #
22
+ def product_code
23
+ end
24
+
25
+ # Expected date for backordered/preordered/customized item to be
26
+ # fulfilled (in YYYY-MM-DD format).
27
+ #
28
+ # @return [String]
29
+ #
30
+ def expected_fulfillment_date
31
+ end
32
+
33
+ # One of the following possible values of ExceptionTypes enumeration:
34
+ #
35
+ # | ExceptionType | Name | Description |
36
+ # -------------------------------------------------------------------
37
+ # | 1 | Out Of Stock | Out of stock, will not be fulfilled. |
38
+ # | 2 | Backorder Preorder Customized Item | Backorder/preorder/customized item, will be fulfilled. |
39
+ #
40
+ # @return [Integer]
41
+ #
42
+ def exception_type
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,108 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class UpdateOrderDispatchRequest
4
+ attr_reader :fulfillment_id, :tracking_number
5
+
6
+ def initialize(fulfillment_id, tracking_number: nil)
7
+ @fulfillment_id = fulfillment_id
8
+ @tracking_number = tracking_number
9
+ end
10
+
11
+ def as_json(*args)
12
+ {
13
+ OrderId: order_id,
14
+ MerchantOrderId: merchant_order_id,
15
+ DeliveryReferenceNumber: delivery_reference_number,
16
+ IsCompleted: is_completed,
17
+ Parcels: parcels,
18
+ Exceptions: exceptions,
19
+ TrackingDetails: tracking_details
20
+ }
21
+ end
22
+
23
+ # Global-e order unique identifier.
24
+ # NOTE either OrderID or MerchantOrderID should be specified.
25
+ # This property is mandatory only if MerchantOrderID property has not been specified.
26
+ #
27
+ # @return [String]
28
+ #
29
+ def order_id
30
+ order.global_e_id
31
+ end
32
+
33
+ # Order unique identifier on the Merchant’s site.
34
+ # NOTE either OrderID or MerchantOrderID should be specified.
35
+ # This property is mandatory only if OrderID property has not been specified.
36
+ #
37
+ # @return [String]
38
+ #
39
+ def merchant_order_id
40
+ end
41
+
42
+ # Merchant’s internal Delivery Reference Number for this order.
43
+ #
44
+ # @return [String]
45
+ #
46
+ def delivery_reference_number
47
+ end
48
+
49
+ # Flag to mark orders as “completed” by the merchant. TRUE if order
50
+ # fulfilment has been completed and no more products will be shipped.
51
+ # FALSE if order fulfilment hasn’t been completed yet.
52
+ #
53
+ # @return [Boolean]
54
+ #
55
+ def is_completed
56
+ [:shipped, :canceled].include? fulfilment.status
57
+ end
58
+
59
+ # List of Parcel object for this UpdateOrderDispatchRequest.
60
+ # NOTE either Parcels or Exceptions should be specified.
61
+ # This property is mandatory only if Exceptions property has not been specified.
62
+ #
63
+ # @return [Array<Workarea::GlobalE::Parcel>, Nil]
64
+ #
65
+ def parcels
66
+ return unless tracking_number.present?
67
+
68
+ @parcels ||= Array.wrap(fulfilment.find_package(tracking_number)).map do |package|
69
+ GlobalE::Parcel.new(
70
+ fulfilment,
71
+ Storefront::PackageViewModel.wrap(package, order: order)
72
+ )
73
+ end
74
+ end
75
+
76
+ # List of UpdateOrderDispatchException objects for this the
77
+ # UpdateOrderDispatchRequest. NOTE either Parcels or Exceptions should be
78
+ # specified. This property is mandatory only if Parcels property has not
79
+ # been specified.
80
+ #
81
+ # @return [Workarea::GlobalE::UpdateOrderDispatchException, nil]
82
+ #
83
+ def exceptions
84
+ end
85
+
86
+ # Tracking information on order level of the parcel in case the merchant
87
+ # does the shipping by itself.
88
+ #
89
+ # @return [Workarea::GlobalE::TrackingDetails nil]
90
+ #
91
+ def tracking_details
92
+ return unless tracking_number.present?
93
+
94
+ TrackingDetails.new(tracking_number: tracking_number)
95
+ end
96
+
97
+ private
98
+
99
+ def fulfilment
100
+ @fulfilment ||= Workarea::Fulfillment.find fulfillment_id
101
+ end
102
+
103
+ def order
104
+ @order ||= Order.find fulfillment_id
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,21 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class UserIdNumberType
4
+
5
+ # Code denoting a user identification document type (e.g. Passport, ID
6
+ # card, etc.) on the Merchant’s site (to be mapped on Global-e side)
7
+ #
8
+ # @return [String]
9
+ #
10
+ def user_id_number_type_code
11
+ end
12
+
13
+ # Identification document type name
14
+ #
15
+ # @return [String]
16
+ #
17
+ def name
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,151 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class UserDetails
4
+ # Internal User identifier on the Merchant’s site
5
+ #
6
+ # optional
7
+ #
8
+ # @return [String]
9
+ #
10
+ def user_id
11
+ end
12
+
13
+ # User’s personal ID document number
14
+ #
15
+ # optional
16
+ #
17
+ # @return [String]
18
+ #
19
+ def user_id_number
20
+ end
21
+
22
+ # User’s personal ID document type (e.g. Passport, ID card, etc.)
23
+ #
24
+ # optional
25
+ #
26
+ # @return [Workarea::GlobalE::UserIdNumberType]
27
+ #
28
+ def user_id_number_type
29
+ end
30
+
31
+ # First name
32
+ #
33
+ # @return [String]
34
+ #
35
+ def first_name
36
+ end
37
+
38
+ # Last name
39
+ #
40
+ # @return [String]
41
+ #
42
+ def last_name
43
+ end
44
+
45
+ # Middle name
46
+ #
47
+ # @return [String
48
+ #
49
+ def middle_name
50
+ end
51
+
52
+ # Salutation or title (e.g. Dr., Mr., etc.)
53
+ #
54
+ # @return [String]
55
+ #
56
+ def salutation
57
+ end
58
+
59
+ # Phone 1
60
+ #
61
+ # @return [String]
62
+ #
63
+ def phone1
64
+ end
65
+
66
+ # Phone 2
67
+ #
68
+ # @return [String]
69
+ #
70
+ def phone2
71
+ end
72
+
73
+ # Fax
74
+ #
75
+ # @return [String]
76
+ #
77
+ def fax
78
+ end
79
+
80
+ # E-mail address
81
+ #
82
+ # @return [String]
83
+ #
84
+ def email
85
+ end
86
+
87
+ # Company name
88
+ #
89
+ # @return [String]
90
+ #
91
+ def company
92
+ end
93
+
94
+ # Address line 1
95
+ #
96
+ # @return [String]
97
+ #
98
+ def address1
99
+ end
100
+
101
+ # Address line 2
102
+ #
103
+ # @return [String]
104
+ #
105
+ def address2
106
+ end
107
+
108
+ # City name
109
+ #
110
+ # @return [String]
111
+ #
112
+ def city
113
+ end
114
+
115
+ # State or province name
116
+ #
117
+ # @return [String]
118
+ #
119
+ def state_or_province
120
+ end
121
+
122
+ # State or province ISO code such as AZ for Arizona (if applicable)
123
+ #
124
+ # @return [String]
125
+ #
126
+ def state_code
127
+ end
128
+
129
+ # Zip or postal code
130
+ #
131
+ # @return [String]
132
+ #
133
+ def zip
134
+ end
135
+
136
+ # 2-char ISO country code
137
+ #
138
+ # @return [String]
139
+ #
140
+ def country_code
141
+ end
142
+
143
+ # Country name
144
+ #
145
+ # @return [String]
146
+ #
147
+ def country_name
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,20 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class VatCategory
4
+
5
+ # Code used to identify the VAT category on the Merchant’s site (to be mapped on Global-e side)
6
+ #
7
+ # @return [String]
8
+ #
9
+ def vat_category_code
10
+ end
11
+
12
+ # VAT Category name
13
+ #
14
+ # @return [String]
15
+ #
16
+ def name
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ module Workarea
2
+ module GlobalE
3
+ class VateRateType
4
+
5
+ # VAT rate type (or class) code on the Merchant’s site (to be mapped on Global-e side)
6
+ #
7
+ # @return [String]
8
+ #
9
+ def vat_rate_type_code
10
+ end
11
+
12
+ # VAT rate type name
13
+ #
14
+ # @return [String]
15
+ #
16
+ def name
17
+ end
18
+
19
+ # VAT rate decimal value
20
+ #
21
+ # return [Float]
22
+ #
23
+ def rate
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module Workarea
2
+ decorate SaveOrderAnalytics do
3
+ def all_price_adjustments
4
+ super + @order.discount_adjustments
5
+ end
6
+
7
+ def discounts_by(field)
8
+ all_price_adjustments.select(&:discount?).reduce({}) do |memo, price_adjustment|
9
+ next memo unless price_adjustment.data.has_key? 'discount_id'
10
+ discount_id = price_adjustment.data['discount_id']
11
+
12
+ memo[discount_id] ||= 0
13
+ memo[discount_id] += price_adjustment.send(field).abs
14
+ memo
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Workarea
2
+ decorate Admin::OrderViewModel, with: :global_e do
3
+ def global_e_api_events
4
+ @global_e_api_events ||= GlobalE::OrderApiEvents.find model.id rescue nil
5
+ end
6
+
7
+ def total_adjustments
8
+ return super unless model.global_e?
9
+
10
+ model.discount_adjustments
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module Workarea
2
+ decorate Storefront::CartViewModel, with: :global_e do
3
+ def total_adjustments
4
+ model.price_adjustments.adjusting("order").group_discounts_by_id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module Workarea
2
+ decorate Storefront::OrderItemViewModel, with: :global_e do
3
+ def total_adjustments
4
+ model.price_adjustments.adjusting("item")
5
+ end
6
+
7
+ def original_price
8
+ return super unless order.global_e?
9
+
10
+ Money.from_amount(
11
+ international_price_adjustments.first.data['original_price'],
12
+ order.currency
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ module Workarea
2
+ decorate Storefront::OrderViewModel, with: :global_e do
3
+ def subtotal_price
4
+ return super unless model.global_e?
5
+
6
+ model.international_subtotal_price
7
+ end
8
+
9
+ def total_price
10
+ return super unless model.global_e?
11
+
12
+ model.international_total_price
13
+ end
14
+
15
+ def shipping_total
16
+ return super unless model.global_e?
17
+
18
+ model.international_shipping_total
19
+ end
20
+
21
+ def total_adjustments
22
+ return super unless model.global_e?
23
+
24
+ @total_adjustments ||= international_price_adjustments.reduce_by_description('order')
25
+ end
26
+
27
+ def store_credit_amount
28
+ if store_credit.present?
29
+ store_credit.amount
30
+ else
31
+ 0.to_m(order.currency)
32
+ end
33
+ end
34
+
35
+ if Plugin.installed?(:gift_cards)
36
+ def gift_card_tender_amount
37
+ if gift_card?
38
+ gift_card_tender.amount
39
+ else
40
+ 0.to_m(order.currency)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ module Workarea
2
+ decorate Storefront::ProductViewModel, with: :global_e do
3
+ decorated do
4
+ delegate :sell_min_fixed_prices, :sell_max_fixed_prices, :original_min_fixed_prices, :original_max_fixed_prices, to: :pricing
5
+ end
6
+
7
+ def current_product?
8
+ options["controller"] == "workarea/storefront/products" &&
9
+ options["action"] == "show" &&
10
+ options["id"] == model.slug
11
+ end
12
+
13
+ # @return [::String, nil]
14
+ #
15
+ def country_exceptions_data
16
+ return unless current_product?
17
+
18
+ data = model.country_exceptions.map do |country_exception|
19
+ [
20
+ country_exception.country.alpha2,
21
+ {
22
+ restricted: country_exception.restricted.presence,
23
+ vat: country_exception.vat_rate.presence
24
+ }.compact
25
+ ]
26
+ end.to_h
27
+
28
+ if model.global_e_forbidden?
29
+ data["all"] = { "forbidden" => true }
30
+ end
31
+
32
+ data.to_json
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ .grid__cell
2
+ .card{ class: card_classes(:country_exceptions, local_assigns[:active]) }
3
+ = link_to catalog_product_country_exceptions_path(model), class: 'card__header' do
4
+ %span.card__header-text= t('workarea.admin.catalog_products.cards.country_exceptions.title')
5
+ = inline_svg 'workarea/admin/i18n.svg', class: 'card__icon'
6
+
7
+ - if local_assigns[:active].blank?
8
+ .card__body
9
+ - if model.country_exceptions.empty?
10
+ %p.card__empty-note= t('workarea.admin.catalog_products.cards.country_exceptions.no_country_exceptions')
11
+ = link_to catalog_product_country_exceptions_path(model), class: 'card__button' do
12
+ %span.button.button--small= t('workarea.admin.catalog_products.cards.country_exceptions.add_country_exceptions')
13
+ - else
14
+ %ul.list-reset
15
+ - model.country_exceptions.take(10).each do |country_exception|
16
+ %li
17
+ %strong= t('workarea.admin.fields.country')
18
+ = country_exception.country
19
+ %li
20
+ %strong= t('workarea.admin.fields.restricted')
21
+ = country_exception.restricted
22
+
23
+ %li
24
+ %strong= t('workarea.admin.fields.vat_rate')
25
+ = country_exception.vat_rate
26
+
27
+ %hr.card__hr
28
+ - if model.country_exceptions.size > 10
29
+ %li= t('workarea.admin.cards.more', amount: model.country_exceptions.size - 10)
30
+ = link_to catalog_product_country_exceptions_path(model), class: 'card__button' do
31
+ %span.button.button--small= t('workarea.admin.catalog_products.cards.country_exceptions.button')
@@ -0,0 +1,3 @@
1
+ %li
2
+ %strong= t('workarea.admin.country_exceptions.global_e_forbidden')
3
+ = product.global_e_forbidden.to_s
@@ -0,0 +1,4 @@
1
+ .grid__cell.grid__cell--25
2
+ .property
3
+ %span.property__name= t('workarea.admin.country_exceptions.global_e_forbidden')
4
+ = toggle_button_for 'product[global_e_forbidden]', @product.global_e_forbidden, title_true: t('workarea.admin.catalog_products.edit.global_e_forbidden'), title_false: t('workarea.admin.catalog_products.edit.not_global_e_forbidden')
@@ -0,0 +1,48 @@
1
+ - @page_title = t('workarea.admin.country_exceptions.edit.page_title', product: @product.name)
2
+
3
+ .view
4
+ .view__header
5
+ .grid
6
+ .grid__cell.grid__cell--25
7
+ = render 'workarea/admin/releases/select'
8
+ .grid__cell.grid__cell--50
9
+ .view__heading
10
+ = link_to_index_for(@product)
11
+ %h1= link_to @product.name, url_for(@product)
12
+ .grid__cell.grid__cell--25
13
+ = render_aux_navigation_for(@product)
14
+
15
+ .view__container
16
+ = render_cards_for(@product, :country_exceptions)
17
+
18
+ .view__container.view__container
19
+ = form_tag catalog_product_country_exception_path(@product, @country_exception), method: :patch, data: { unsaved_changes: '' } do
20
+
21
+ %table
22
+ %thead
23
+ %tr
24
+ %th= t('workarea.admin.fields.country')
25
+ %th= t('workarea.admin.fields.vat_rate')
26
+ %th= t('workarea.admin.fields.restricted')
27
+ %th
28
+ %th
29
+ %tbody
30
+ - @product.country_exceptions.each do |country_exception|
31
+ - if country_exception.id == @country_exception.id
32
+ %tr
33
+ %td
34
+ = select_tag "country_exception[country]", options_for_select(global_e_country_options, @country_exception.country.alpha2), title: t('workarea.admin.fields.country')
35
+ %td
36
+ = text_field_tag 'country_exception[vat_rate]', @country_exception.vat_rate, class: 'text-box text-box--small', title: t('workarea.admin.fields.vat_rate')
37
+ %td
38
+ = toggle_button_for 'country_exception[restricted]', @country_exception.restricted?
39
+ - else
40
+ %tr
41
+ %td= country_exception.country
42
+ %td= country_exception.vat_rate
43
+ %td= country_exception.restricted
44
+ %td
45
+
46
+ .workflow-bar
47
+ .grid.grid--auto.grid--right.grid--middle
48
+ .grid__cell= button_tag t('workarea.admin.form.save_changes'), value: 'save_country_exception', class: 'workflow-bar__button workflow-bar__button--update'
@@ -0,0 +1,47 @@
1
+ - @page_title= t('workarea.admin.country_exceptions.index.page_title', product: @product.name)
2
+
3
+ .view
4
+ .view__header
5
+ .grid
6
+ .grid__cell.grid__cell--25
7
+ = render 'workarea/admin/releases/select'
8
+ .grid__cell.grid__cell--50
9
+ .view__heading
10
+ = link_to_index_for(@product)
11
+ %h1= link_to @product.name, url_for(@product)
12
+ .grid__cell.grid__cell--25
13
+ = render_aux_navigation_for(@product)
14
+
15
+ .view__container
16
+ = render_cards_for(@product, :country_exceptions)
17
+
18
+ .section
19
+ %h2.view__heading= t('workarea.admin.country_exceptions.index.heading')
20
+
21
+ %table.index-table
22
+ %thead
23
+ %tr
24
+ %th= t('workarea.admin.fields.country')
25
+ %th= t('workarea.admin.fields.vat_rate')
26
+ %th= t('workarea.admin.fields.restricted')
27
+ %th
28
+ %tbody
29
+ - @product.country_exceptions.each do |country_exception|
30
+ %tr.index-table__row
31
+ %td= country_exception.country.name
32
+ %td= country_exception.vat_rate
33
+ %td
34
+ - if country_exception.restricted?
35
+ restricted
36
+ - else
37
+ not restricted
38
+ %td
39
+ .align-right<
40
+ = link_to edit_catalog_product_country_exception_path(@product, country_exception), id: dom_id(country_exception, 'edit_action') do
41
+ = inline_svg('workarea/admin/icons/edit.svg', class: 'svg-icon svg-icon--small', title: t('workarea.admin.actions.edit'))
42
+ = link_to catalog_product_country_exception_path(@product, country_exception), id: dom_id(country_exception, 'delete_action'), data: { method: 'delete', confirm: t('workarea.admin.actions.delete_confirmation') } do
43
+ = inline_svg('workarea/admin/icons/delete.svg', class: 'svg-icon svg-icon--small svg-icon--red', title: t('workarea.admin.actions.delete'))
44
+ .workflow-bar
45
+ .grid.grid--auto.grid--right.grid--middle
46
+ .grid__cell
47
+ = link_to t('workarea.admin.country_exceptions.index.add_new'), new_catalog_product_country_exception_path(@product), class: 'workflow-bar__button workflow-bar__button--create'