spree_vpago 0.1.0.pre.beta

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 (262) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +3 -0
  3. data/.github/workflows/test_and_publish_gem.yml +96 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +56 -0
  7. data/.ruby-version +1 -0
  8. data/.tool-versions +1 -0
  9. data/.travis.yml +45 -0
  10. data/Appraisals +20 -0
  11. data/Gemfile +27 -0
  12. data/Gemfile.lock +656 -0
  13. data/LICENSE +26 -0
  14. data/README.md +151 -0
  15. data/Rakefile +21 -0
  16. data/app/.gitkeep +0 -0
  17. data/app/assets/config/spree_vpago_manifest.js +3 -0
  18. data/app/assets/images/backend-process.svg +3 -0
  19. data/app/assets/images/vpago/payway/abapay.png +0 -0
  20. data/app/assets/images/vpago/payway/cards.png +0 -0
  21. data/app/assets/javascripts/vpago/vpago_payments/request_process_payment.js +44 -0
  22. data/app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js +15802 -0
  23. data/app/controllers/.gitkeep +0 -0
  24. data/app/controllers/spree/acleda_redirects_controller.rb +22 -0
  25. data/app/controllers/spree/admin/payment_methods_controller_decorator.rb +65 -0
  26. data/app/controllers/spree/admin/payment_payway_base_controller.rb +25 -0
  27. data/app/controllers/spree/admin/payment_payway_checkers_controller.rb +34 -0
  28. data/app/controllers/spree/admin/payment_payway_markers_controller.rb +44 -0
  29. data/app/controllers/spree/admin/payment_payway_queriers_controller.rb +39 -0
  30. data/app/controllers/spree/admin/payment_wing_sdk_base_controller.rb +21 -0
  31. data/app/controllers/spree/admin/payment_wing_sdk_checkers_controller.rb +26 -0
  32. data/app/controllers/spree/admin/payment_wing_sdk_markers_controller.rb +36 -0
  33. data/app/controllers/spree/admin/payment_wing_sdk_queriers_controller.rb +20 -0
  34. data/app/controllers/spree/admin/payments_controller_decorator.rb +19 -0
  35. data/app/controllers/spree/admin/payout_profile_products_controller.rb +21 -0
  36. data/app/controllers/spree/admin/payout_profile_shipping_methods_controller.rb +21 -0
  37. data/app/controllers/spree/admin/payout_profiles_controller.rb +91 -0
  38. data/app/controllers/spree/admin/payouts_controller.rb +16 -0
  39. data/app/controllers/spree/api/v2/storefront/checkout_controller_decorator.rb +84 -0
  40. data/app/controllers/spree/payway_card_popups_controller.rb +20 -0
  41. data/app/controllers/spree/payway_results_controller.rb +11 -0
  42. data/app/controllers/spree/payway_v2_card_popups_controller.rb +20 -0
  43. data/app/controllers/spree/vpago_payments_controller.rb +71 -0
  44. data/app/controllers/spree/webhook/acleda_mobiles_controller.rb +88 -0
  45. data/app/controllers/spree/webhook/acledas_controller.rb +80 -0
  46. data/app/controllers/spree/webhook/base_controller.rb +6 -0
  47. data/app/controllers/spree/webhook/payways_controller.rb +77 -0
  48. data/app/controllers/spree/webhook/wings_controller.rb +63 -0
  49. data/app/controllers/spree/wing/base_controller.rb +29 -0
  50. data/app/controllers/spree/wing/transactions_controller.rb +27 -0
  51. data/app/controllers/spree/wing_redirects_controller.rb +20 -0
  52. data/app/helpers/vpago/admin/base_helper_decorator.rb +40 -0
  53. data/app/helpers/vpago/vpago_payments_helper.rb +12 -0
  54. data/app/javascripts/vpago/vpago_payments/user_informers/firebase.js +62 -0
  55. data/app/jobs/application_unique_job.rb +1 -0
  56. data/app/jobs/vpago/payment_processor_job.rb +8 -0
  57. data/app/models/.gitkeep +0 -0
  58. data/app/models/concerns/vpago/payoutable.rb +11 -0
  59. data/app/models/spree/gateway/acleda.rb +63 -0
  60. data/app/models/spree/gateway/acleda_mobile.rb +46 -0
  61. data/app/models/spree/gateway/payway.rb +66 -0
  62. data/app/models/spree/gateway/payway_v2.rb +174 -0
  63. data/app/models/spree/gateway/wing_sdk.rb +51 -0
  64. data/app/models/spree/payout.rb +23 -0
  65. data/app/models/spree/payout_profile.rb +107 -0
  66. data/app/models/spree/payout_profile_product.rb +14 -0
  67. data/app/models/spree/payout_profile_shipping_method.rb +14 -0
  68. data/app/models/spree/payout_profiles/payway_v2.rb +40 -0
  69. data/app/models/spree/vpago_payment_source.rb +21 -0
  70. data/app/models/vpago/adjustment_decorator.rb +28 -0
  71. data/app/models/vpago/line_item_decorator.rb +75 -0
  72. data/app/models/vpago/order_decorator.rb +78 -0
  73. data/app/models/vpago/payment_decorator.rb +44 -0
  74. data/app/models/vpago/payment_method_decorator.rb +91 -0
  75. data/app/models/vpago/payouts_generator.rb +125 -0
  76. data/app/models/vpago/product_decorator.rb +30 -0
  77. data/app/models/vpago/promotion_action_decorator.rb +9 -0
  78. data/app/models/vpago/shipment_decorator.rb +23 -0
  79. data/app/models/vpago/shipping_method_decorator.rb +33 -0
  80. data/app/models/vpago/shipping_rate_decorator.rb +25 -0
  81. data/app/models/vpago/store_decorator.rb +17 -0
  82. data/app/models/vpago/tax_category_decorator.rb +9 -0
  83. data/app/models/vpago/variant_decorator.rb +22 -0
  84. data/app/models/vpago/vendor_decorator.rb +10 -0
  85. data/app/overrides/spree/admin/adjustments/_adjustment/handle_by_table_body.html.erb.deface +11 -0
  86. data/app/overrides/spree/admin/adjustments/_adjustments_table/handle_by_table_header.html.erb.deface +3 -0
  87. data/app/overrides/spree/admin/adjustments/_form/handle_by_field.html.erb.deface +10 -0
  88. data/app/overrides/spree/admin/orders/_shipment/edit_method.html.erb.deface +26 -0
  89. data/app/overrides/spree/admin/orders/_shipment/show_method.html.erb.deface +27 -0
  90. data/app/overrides/spree/admin/payment_methods/_form/enable_pre_auth_field.html.erb.deface +17 -0
  91. data/app/overrides/spree/admin/payment_methods/_form/vendor_field.html.erb.deface +6 -0
  92. data/app/overrides/spree/admin/payment_methods/index/list.html.erb.deface +45 -0
  93. data/app/overrides/spree/admin/payment_methods/index/payment_methods_tabs.html.erb.deface +9 -0
  94. data/app/overrides/spree/admin/payment_methods/index/vendor_body.html.erb.deface +5 -0
  95. data/app/overrides/spree/admin/payment_methods/index/vendor_header.html.erb.deface +5 -0
  96. data/app/overrides/spree/admin/payments/_list/actions.html.erb.deface +13 -0
  97. data/app/overrides/spree/admin/promotions/_promotion_action/run_by_field.html.erb.deface +13 -0
  98. data/app/overrides/spree/admin/shared/_order_tabs/payouts.html.erb.deface +8 -0
  99. data/app/overrides/spree/admin/shared/_product_tabs/payout_profile_products.html.erb.deface +8 -0
  100. data/app/overrides/spree/admin/shared/sub_menu/_integrations/payout_profiles.html.erb.deface +3 -0
  101. data/app/overrides/spree/admin/shipping_methods/_form/handle_by.html.erb.deface +12 -0
  102. data/app/overrides/spree/admin/shipping_methods/edit/shipping_method_tabs.html.erb.deface +3 -0
  103. data/app/overrides/spree/admin/tax_categories/_form/collect_by_field.html.erb.deface +10 -0
  104. data/app/overrides/spree/admin/tax_categories/index/collect_by_table_body.html.erb.deface +4 -0
  105. data/app/overrides/spree/admin/tax_categories/index/collect_by_table_header.html.erb.deface +4 -0
  106. data/app/serializers/spree/api/v2/platform/vpago_payment_source_serializer.rb +11 -0
  107. data/app/serializers/spree/v2/storefront/payment_method_serializer_decorator.rb +23 -0
  108. data/app/serializers/spree/v2/storefront/payment_redirect_serializer.rb +13 -0
  109. data/app/serializers/spree/v2/storefront/payment_serializer_decorator.rb +13 -0
  110. data/app/serializers/spree/v2/storefront/vpago_payment_source_serializer.rb +9 -0
  111. data/app/services/.gitkeep +0 -0
  112. data/app/services/vpago/payment_finder.rb +27 -0
  113. data/app/services/vpago/payment_processor.rb +72 -0
  114. data/app/services/vpago/payment_redirect_handler.rb +194 -0
  115. data/app/services/vpago/payment_url_constructor.rb +32 -0
  116. data/app/services/vpago/payments/find_or_create.rb +51 -0
  117. data/app/services/vpago/payout_profiles/payway/base_payout_profile_request.rb +38 -0
  118. data/app/services/vpago/payout_profiles/payway/open_ssl_encrypter.rb +31 -0
  119. data/app/services/vpago/payout_profiles/payway/payout_profile_request_creator.rb +50 -0
  120. data/app/services/vpago/payout_profiles/payway/payout_profile_request_params_builder.rb +58 -0
  121. data/app/services/vpago/payout_profiles/payway/payout_profile_request_updater.rb +28 -0
  122. data/app/services/vpago/payway_return_options_builder.rb +39 -0
  123. data/app/services/vpago/user_informers/firebase.rb +52 -0
  124. data/app/views/.gitkeep +0 -0
  125. data/app/views/layouts/acleda.html.erb +18 -0
  126. data/app/views/layouts/payway.html.erb +24 -0
  127. data/app/views/layouts/payway_v2.html.erb +18 -0
  128. data/app/views/layouts/vpago_payments.html.erb +18 -0
  129. data/app/views/layouts/wing.html.erb +18 -0
  130. data/app/views/spree/_payment_icon.html.erb +25 -0
  131. data/app/views/spree/acleda_redirects/show.html.erb +3 -0
  132. data/app/views/spree/admin/payments/source_forms/_payment_payway.html.erb +4 -0
  133. data/app/views/spree/admin/payments/source_forms/_payway_v2.html.erb +7 -0
  134. data/app/views/spree/admin/payments/source_views/_acleda.html.erb +1 -0
  135. data/app/views/spree/admin/payments/source_views/_acleda_mobile.html.erb +1 -0
  136. data/app/views/spree/admin/payments/source_views/_payment_payway.html.erb +98 -0
  137. data/app/views/spree/admin/payments/source_views/_payway_v2.html.erb +5 -0
  138. data/app/views/spree/admin/payments/source_views/_vpago_payment_tmpl.html.erb +113 -0
  139. data/app/views/spree/admin/payments/source_views/_wingsdk.html.erb +5 -0
  140. data/app/views/spree/admin/payout_profile_products/_form.html.erb +28 -0
  141. data/app/views/spree/admin/payout_profile_products/edit.html.erb +18 -0
  142. data/app/views/spree/admin/payout_profile_products/index.html.erb +58 -0
  143. data/app/views/spree/admin/payout_profile_products/new.html.erb +22 -0
  144. data/app/views/spree/admin/payout_profile_shipping_methods/_form.html.erb +28 -0
  145. data/app/views/spree/admin/payout_profile_shipping_methods/edit.html.erb +22 -0
  146. data/app/views/spree/admin/payout_profile_shipping_methods/index.html.erb +6 -0
  147. data/app/views/spree/admin/payout_profile_shipping_methods/new.html.erb +27 -0
  148. data/app/views/spree/admin/payout_profiles/_filter.html.erb +19 -0
  149. data/app/views/spree/admin/payout_profiles/_form.html.erb +72 -0
  150. data/app/views/spree/admin/payout_profiles/edit.html.erb +33 -0
  151. data/app/views/spree/admin/payout_profiles/index.html.erb +63 -0
  152. data/app/views/spree/admin/payout_profiles/new.html.erb +13 -0
  153. data/app/views/spree/admin/payouts/_line_item_info_with_popover.html.erb +43 -0
  154. data/app/views/spree/admin/payouts/index.html.erb +46 -0
  155. data/app/views/spree/admin/shared/_payment_methods_tabs.html.erb +15 -0
  156. data/app/views/spree/admin/shared/_shipping_method_tabs.html.erb +19 -0
  157. data/app/views/spree/admin/shared/payout_profile/_info_card.html.erb +24 -0
  158. data/app/views/spree/admin/shared/payout_profile/_status.html.erb +11 -0
  159. data/app/views/spree/checkout/payment/_acleda.html.erb +1 -0
  160. data/app/views/spree/checkout/payment/_acleda_checkout_form.html.erb +14 -0
  161. data/app/views/spree/checkout/payment/_acleda_mobile.html.erb +0 -0
  162. data/app/views/spree/checkout/payment/_payment_payway.html.erb +21 -0
  163. data/app/views/spree/checkout/payment/_payway_loader.html.erb +2 -0
  164. data/app/views/spree/checkout/payment/_payway_root.html.erb +9 -0
  165. data/app/views/spree/checkout/payment/_payway_script.html.erb +77 -0
  166. data/app/views/spree/checkout/payment/_payway_v2.html.erb +1 -0
  167. data/app/views/spree/checkout/payment/_payway_v2_loader.html.erb +2 -0
  168. data/app/views/spree/checkout/payment/_payway_v2_root.html.erb +9 -0
  169. data/app/views/spree/checkout/payment/_payway_v2_script.html.erb +79 -0
  170. data/app/views/spree/checkout/payment/_wing_checkout_form.html.erb +18 -0
  171. data/app/views/spree/checkout/payment/_wingsdk.html.erb +1 -0
  172. data/app/views/spree/checkout/payment/acleda_form.html.erb +3 -0
  173. data/app/views/spree/checkout/payment/payway_form.html.erb +10 -0
  174. data/app/views/spree/checkout/payment/payway_v2_form.html.erb +10 -0
  175. data/app/views/spree/checkout/payment/wingsdk_form.html.erb +3 -0
  176. data/app/views/spree/payway_card_popups/_form.html.erb +10 -0
  177. data/app/views/spree/payway_card_popups/show.html.erb +5 -0
  178. data/app/views/spree/payway_results/failed.html.erb +1 -0
  179. data/app/views/spree/payway_results/success.html.erb +1 -0
  180. data/app/views/spree/payway_v2_card_popups/_form.html.erb +15 -0
  181. data/app/views/spree/payway_v2_card_popups/show.html.erb +3 -0
  182. data/app/views/spree/vpago_payments/checkout.html.erb +3 -0
  183. data/app/views/spree/vpago_payments/forms/spree/gateway/_payway_v2.html.erb +13 -0
  184. data/app/views/spree/vpago_payments/processing.html.erb +49 -0
  185. data/app/views/spree/vpago_payments/success.html.erb +3 -0
  186. data/app/views/spree/wing_redirects/show.html.erb +3 -0
  187. data/bin/rails +8 -0
  188. data/build.js +9 -0
  189. data/config/initializers/assets.rb +1 -0
  190. data/config/initializers/spree_permitted_attributes.rb +5 -0
  191. data/config/locales/en.yml +28 -0
  192. data/config/locales/km.yml +24 -0
  193. data/config/routes.rb +92 -0
  194. data/db/migrate/20210128040625_create_spree_vpago_payment_sources.rb +14 -0
  195. data/db/migrate/20210430052432_add_fields_to_payment_sources.rb +7 -0
  196. data/db/migrate/20210824044737_add_preference_to_spree_vpago_payment_source.rb +5 -0
  197. data/db/migrate/20240506095140_create_spree_payout_profiles.rb +22 -0
  198. data/db/migrate/20240506095148_create_spree_payout_profile_products.rb +10 -0
  199. data/db/migrate/20240523070757_add_optional_spere_payout_profile_products.rb +5 -0
  200. data/db/migrate/20240715091228_create_spree_payouts.rb +25 -0
  201. data/db/migrate/20240718195510_create_spree_payout_profile_shipping_methods.rb +15 -0
  202. data/db/migrate/20240718201453_add_handle_by_to_spree_adjustments.rb +5 -0
  203. data/db/migrate/20240718201509_add_run_by_to_spree_promotion_actions.rb +5 -0
  204. data/db/migrate/20240718201523_add_collect_by_to_spree_tax_categories.rb +5 -0
  205. data/db/migrate/20240718201538_add_handle_by_to_spree_shipping_method.rb +5 -0
  206. data/db/migrate/20240718201554_add_handle_by_to_spree_shipping_rates.rb +5 -0
  207. data/db/migrate/20240808102853_add_vendor_reference_to_spree_payment_methods.rb +7 -0
  208. data/db/migrate/20240904030132_add_gateway_status_to_spree_payments.rb +5 -0
  209. data/db/migrate/20241029071959_add_pre_auth_response_to_spree_payment.rb +5 -0
  210. data/db/migrate/20241202104014_add_enable_pre_auth_to_spree_payment_method.rb +5 -0
  211. data/db/migrate/20250121044614_add_transaction_response_to_spree_payments.rb +5 -0
  212. data/docs/acleda.md +65 -0
  213. data/gemfiles/spree_3_7.gemfile +9 -0
  214. data/gemfiles/spree_4_0.gemfile +8 -0
  215. data/gemfiles/spree_4_1.gemfile +9 -0
  216. data/gemfiles/spree_master.gemfile +8 -0
  217. data/lib/generators/spree_vpago/install/install_generator.rb +26 -0
  218. data/lib/generators/spree_vpago/install/templates/app/assets/images/vpago/payway/acleda_merchant_logo_300x300.png +0 -0
  219. data/lib/spree_vpago/engine.rb +36 -0
  220. data/lib/spree_vpago/factories.rb +6 -0
  221. data/lib/spree_vpago/version.rb +9 -0
  222. data/lib/spree_vpago.rb +5 -0
  223. data/lib/vpago/acleda/base.rb +111 -0
  224. data/lib/vpago/acleda/checkout.rb +105 -0
  225. data/lib/vpago/acleda/deeplink_checkout.rb +74 -0
  226. data/lib/vpago/acleda/payment_request_updater.rb +38 -0
  227. data/lib/vpago/acleda/transaction_status.rb +71 -0
  228. data/lib/vpago/acleda_mobile/base.rb +28 -0
  229. data/lib/vpago/acleda_mobile/callback_validator.php +35 -0
  230. data/lib/vpago/acleda_mobile/callback_validator.rb +38 -0
  231. data/lib/vpago/acleda_mobile/checkout.rb +78 -0
  232. data/lib/vpago/acleda_mobile/payment_request_updater.rb +34 -0
  233. data/lib/vpago/acleda_mobile/payment_retriever.rb +24 -0
  234. data/lib/vpago/acleda_mobile/transaction_status.rb +35 -0
  235. data/lib/vpago/payment_amount_calculator.rb +23 -0
  236. data/lib/vpago/payment_request_updater.rb +19 -0
  237. data/lib/vpago/payment_status_marker.rb +109 -0
  238. data/lib/vpago/payway/base.rb +112 -0
  239. data/lib/vpago/payway/checkout.rb +24 -0
  240. data/lib/vpago/payway/payment_request_updater.rb +31 -0
  241. data/lib/vpago/payway/payment_status_marker.rb +84 -0
  242. data/lib/vpago/payway/transaction_status.rb +74 -0
  243. data/lib/vpago/payway.rb +13 -0
  244. data/lib/vpago/payway_v2/base.rb +153 -0
  245. data/lib/vpago/payway_v2/checkout.rb +35 -0
  246. data/lib/vpago/payway_v2/payment_request_updater.rb +65 -0
  247. data/lib/vpago/payway_v2/payouts_params_constructor.rb +47 -0
  248. data/lib/vpago/payway_v2/pre_auth_canceler.rb +43 -0
  249. data/lib/vpago/payway_v2/pre_auth_completer.rb +76 -0
  250. data/lib/vpago/payway_v2/transaction_status.rb +85 -0
  251. data/lib/vpago/wing_sdk/base.rb +58 -0
  252. data/lib/vpago/wing_sdk/checkout.rb +20 -0
  253. data/lib/vpago/wing_sdk/payment_request_updater.rb +46 -0
  254. data/lib/vpago/wing_sdk/payment_retriever.rb +34 -0
  255. data/lib/vpago/wing_sdk/transaction_status_checker.rb +64 -0
  256. data/lib/vpago/wing_sdk/transaction_status_response.rb +33 -0
  257. data/node_modules/.yarn-integrity +147 -0
  258. data/package-lock.json +1491 -0
  259. data/package.json +10 -0
  260. data/spree_vpago.gemspec +33 -0
  261. data/yarn.lock +921 -0
  262. metadata +403 -0
File without changes
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ class AcledaRedirectsController < ApplicationController
3
+ layout 'acleda'
4
+ before_action :load_payment, only: [:show]
5
+
6
+ def show
7
+ if @payment.present?
8
+ options = {
9
+ app_checkout: true
10
+ }
11
+
12
+ @client_redirect = ActiveRecord::Base.connected_to(role: :writing) do
13
+ ::Vpago::Acleda::Checkout.new(@payment, options)
14
+ end
15
+ end
16
+ end
17
+
18
+ def load_payment
19
+ @payment = ::Spree::Payment.find_by(number: params[:payment_number])
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,65 @@
1
+ module Spree
2
+ module Admin
3
+ module PaymentMethodsControllerDecorator
4
+ def scope
5
+ scope = current_store.payment_methods_including_vendor.accessible_by(current_ability, :index)
6
+ scope = scope.where.not(vendor_id: nil) if params[:tab] == 'vendors'
7
+ scope
8
+ end
9
+
10
+ # overrdie
11
+ # handling error response
12
+ def create
13
+ @payment_method = params[:payment_method].delete(:type).constantize.new(payment_method_params)
14
+ @object = @payment_method
15
+ set_current_store
16
+ invoke_callbacks(:create, :before)
17
+ if @payment_method.save
18
+ invoke_callbacks(:create, :after)
19
+ flash[:success] = Spree.t(:successfully_created, resource: Spree.t(:payment_method))
20
+ redirect_to location_after_create
21
+ else
22
+ invoke_callbacks(:create, :fails)
23
+ respond_with(@object) do |format|
24
+ format.html { render action: :new, status: :unprocessable_entity }
25
+ format.js { render layout: false, status: :unprocessable_entity }
26
+ end
27
+ end
28
+ end
29
+
30
+ # overrdie
31
+ # handling error response
32
+ def update
33
+ invoke_callbacks(:update, :before)
34
+ payment_method_type = params[:payment_method].delete(:type)
35
+ if @payment_method['type'].to_s != payment_method_type
36
+ @payment_method.update_columns(
37
+ type: payment_method_type,
38
+ updated_at: Time.current
39
+ )
40
+ @payment_method = scope.find(params[:id])
41
+ end
42
+
43
+ attributes = payment_method_params.merge(preferences_params)
44
+ attributes.each do |k, _v|
45
+ attributes.delete(k) if k.include?('password') && attributes[k].blank?
46
+ end
47
+
48
+ if @payment_method.update(attributes)
49
+ set_current_store
50
+ invoke_callbacks(:update, :after)
51
+ flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payment_method))
52
+ redirect_to spree.edit_admin_payment_method_path(@payment_method)
53
+ else
54
+ invoke_callbacks(:update, :fails)
55
+ respond_with(@payment_method) do |format|
56
+ format.html { render :edit, status: :unprocessable_entity }
57
+ format.json { render json: @payment_method.errors.full_messages.to_sentence, status: :unprocessable_entity }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ Spree::Admin::PaymentMethodsController.prepend(Spree::Admin::PaymentMethodsControllerDecorator)
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentPaywayBaseController < Spree::Admin::BaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ before_action :load_payment, only: %i[show update]
7
+ # before_action :validate_order, only: [:update]
8
+
9
+ def validate_order
10
+ return unless @payment.order.completed?
11
+
12
+ flash[:error] = Spree.t('vpago.payments.not_allow_for_order_completed')
13
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
14
+ end
15
+
16
+ def load_payment
17
+ @payment = Payment.find_by!(number: params[:id])
18
+ end
19
+
20
+ def model_class
21
+ Spree::Payment
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentPaywayCheckersController < PaymentPaywayBaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ def update
7
+ options = {
8
+ updated_by_user_id: try_spree_current_user.id,
9
+ updated_reason: Spree.t('vpago.payments.checker_updated_by_description')
10
+ }
11
+ spree_updater = payment_request_update_service.new(@payment, options)
12
+ spree_updater.call
13
+
14
+ @payment.reload
15
+
16
+ if @payment.order.completed?
17
+ flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payments))
18
+ else
19
+ flash[:error] = Spree.t(:unsuccessfully_updated, resource: Spree.t(:payments))
20
+ end
21
+
22
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
23
+ end
24
+
25
+ def payment_request_update_service
26
+ if @payment.payment_method.type_payway_v2?
27
+ Vpago::PaywayV2::PaymentRequestUpdater
28
+ elsif @payment.payment_method.type_payway?
29
+ Vpago::Payway::PaymentRequestUpdater
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentPaywayMarkersController < PaymentPaywayBaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ def update
7
+ reason = params[:updated_reason]&.strip
8
+
9
+ if reason.blank?
10
+ flash[:error] = Spree.t('vpago.payments.failed_require_updated_reason')
11
+ return redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
12
+ end
13
+
14
+ options = {
15
+ updated_by_user_id: try_spree_current_user.id,
16
+ updated_reason: reason,
17
+ status: true,
18
+ description: 'vpago.payments.mark_with_reason'
19
+ }
20
+
21
+ spree_updater = status_marker_service.new(@payment, options)
22
+ spree_updater.call
23
+
24
+ @payment.reload
25
+
26
+ if @payment.order.completed?
27
+ flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payments))
28
+ else
29
+ flash[:error] = Spree.t(:unsuccessfully_updated, resource: Spree.t(:payments))
30
+ end
31
+
32
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
33
+ end
34
+
35
+ def status_marker_service
36
+ if @payment.payment_method.type_payway_v2?
37
+ Vpago::PaymentStatusMarker
38
+ elsif @payment.payment_method.type_payway?
39
+ Vpago::Payway::PaymentStatusMarker
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentPaywayQueriersController < PaymentPaywayBaseController
4
+ include Spree::Backend::Callbacks
5
+ around_action :set_writing_role, only: %i[show]
6
+
7
+ def show
8
+ tran_status = transaction_status_service.new(@payment)
9
+ tran_status.call
10
+
11
+ if tran_status.success?
12
+ @payment.update_column(:gateway_status, true)
13
+ flash[:success] =
14
+ Spree.t('vpago.payments.payment_found_with_result', result: tran_status.json_response)
15
+ else
16
+ flash[:error] = Spree.t('vpago.payments.payment_not_found_with_error', error: tran_status.error_message)
17
+ end
18
+
19
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
20
+ end
21
+
22
+ def transaction_status_service
23
+ if @payment.payment_method.type_payway_v2?
24
+ Vpago::PaywayV2::TransactionStatus
25
+ elsif @payment.payment_method.type_payway?
26
+ Vpago::Payway::TransactionStatus
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def set_writing_role
33
+ ActiveRecord::Base.connected_to(role: :writing) do
34
+ yield if block_given?
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentWingSdkBaseController < Spree::Admin::BaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ before_action :load_payment, only: %i[show update]
7
+ before_action :validate_order, only: [:update]
8
+
9
+ def validate_order
10
+ if @payment.order.completed?
11
+ flash[:error] = Spree.t('vpago.payments.not_allow_for_order_completed')
12
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
13
+ end
14
+ end
15
+
16
+ def load_payment
17
+ @payment = Payment.find_by!(number: params[:id])
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentWingSdkCheckersController < PaymentWingSdkBaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ def update
7
+ options = {
8
+ updated_by_user_id: try_spree_current_user.id,
9
+ updated_reason: Spree.t('vpago.payments.checker_updated_by_description')
10
+ }
11
+ spree_updater = Vpago::WingSdk::PaymentRequestUpdater.new(@payment, options)
12
+ spree_updater.call
13
+
14
+ @payment.reload
15
+
16
+ if @payment.order.completed?
17
+ flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payments))
18
+ else
19
+ flash[:error] = Spree.t(:unsuccessfully_updated, resource: Spree.t(:payments))
20
+ end
21
+
22
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentWingSdkMarkersController < PaymentWingSdkBaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ def update
7
+ reason = params[:updated_reason]&.strip
8
+
9
+ if reason.blank?
10
+ flash[:error] = Spree.t('vpago.payments.failed_require_updated_reason')
11
+ return redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
12
+ end
13
+
14
+ options = {
15
+ updated_by_user_id: try_spree_current_user.id,
16
+ updated_reason: reason,
17
+ status: true,
18
+ description: 'vpago.payments.mark_with_reason'
19
+ }
20
+
21
+ spree_updater = Vpago::PaymentStatusMarker.new(@payment, options)
22
+ spree_updater.call
23
+
24
+ @payment.reload
25
+
26
+ if @payment.order.completed?
27
+ flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payments))
28
+ else
29
+ flash[:error] = Spree.t(:unsuccessfully_updated, resource: Spree.t(:payments))
30
+ end
31
+
32
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module Admin
3
+ class PaymentWingSdkQueriersController < PaymentWingSdkBaseController
4
+ include Spree::Backend::Callbacks
5
+
6
+ def show
7
+ tran_status = Vpago::WingSdk::TransactionStatusChecker.new(@payment)
8
+ tran_status.call
9
+
10
+ if tran_status.success?
11
+ flash[:success] = Spree.t('vpago.payments.payment_found_with_result', result: tran_status.result)
12
+ else
13
+ flash[:error] = Spree.t('vpago.payments.payment_not_found_with_error', error: tran_status.error_message)
14
+ end
15
+
16
+ redirect_to admin_order_payment_path(order_id: @payment.order.number, id: @payment.number)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Admin
3
+ module PaymentsControllerDecorator
4
+ def self.prepended(base)
5
+ base.before_action :set_vpago_payment_source, only: %i[create update]
6
+ end
7
+
8
+ def set_vpago_payment_source
9
+ payment_method ||= Spree::PaymentMethod.find(params[:payment][:payment_method_id])
10
+ return unless payment_method.vpago_payment?
11
+
12
+ source_params = { payment_option: payment_method.preferred_payment_option }
13
+ params[:payment][:source_attributes] = source_params
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ Spree::Admin::PaymentsController.prepend(Spree::Admin::PaymentsControllerDecorator)
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ module Admin
3
+ class PayoutProfileProductsController < Spree::Admin::ResourceController
4
+ before_action :redirect_to_object, only: [:index]
5
+
6
+ belongs_to 'spree/product', find_by: :slug
7
+
8
+ def redirect_to_object
9
+ if parent.payout_profile_products.any?
10
+ redirect_to edit_object_url(parent.payout_profile_products.first)
11
+ else
12
+ redirect_to new_object_url
13
+ end
14
+ end
15
+
16
+ def model_class
17
+ Spree::PayoutProfileProduct
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ module Admin
3
+ class PayoutProfileShippingMethodsController < Spree::Admin::ResourceController
4
+ before_action :redirect_to_object, only: [:index]
5
+
6
+ belongs_to 'spree/shipping_method'
7
+
8
+ def redirect_to_object
9
+ if parent.payout_profile_shipping_methods.any?
10
+ redirect_to edit_object_url(parent.payout_profile_shipping_methods.first)
11
+ else
12
+ redirect_to new_object_url
13
+ end
14
+ end
15
+
16
+ def model_class
17
+ Spree::PayoutProfileShippingMethod
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,91 @@
1
+ module Spree
2
+ module Admin
3
+ class PayoutProfilesController < Spree::Admin::ResourceController
4
+ before_action :load_types
5
+
6
+ skip_before_action :load_resource, only: %i[index verify_with_bank]
7
+
8
+ create.after :reset_verification
9
+ update.after :reset_verification
10
+
11
+ update.after :save_defaults!
12
+ create.after :save_defaults!
13
+
14
+ # when updated, active must be false.
15
+ # call verify_with_bank to reactivate with bank.
16
+ def reset_verification
17
+ @object.reset_verification!
18
+ end
19
+
20
+ def save_defaults!
21
+ instance = Spree::PayoutProfile.find(@object.id)
22
+
23
+ instance.default = Spree::Store.default.name == instance.name
24
+ instance.set_default_preferences if instance.respond_to?(:set_default_preferences)
25
+ instance.save!
26
+ end
27
+
28
+ def load_types
29
+ @types = ['Spree::PayoutProfiles::PaywayV2']
30
+ end
31
+
32
+ def verify_with_bank
33
+ @object = Spree::PayoutProfile.find(params[:id])
34
+
35
+ instance = if @object.registered_in_bank?
36
+ request_updater.new(@object)
37
+ else
38
+ request_creator.new(@object)
39
+ end
40
+
41
+ if instance.call
42
+ flash[:success] = flash_message_for(@object, :successfully_updated)
43
+ else
44
+ flash[:error] = instance.error_messages.to_s
45
+ end
46
+
47
+ redirect_to edit_object_url(@object)
48
+ end
49
+
50
+ def request_updater
51
+ ::Vpago::PayoutProfiles::Payway::PayoutProfileRequestUpdater
52
+ end
53
+
54
+ def request_creator
55
+ ::Vpago::PayoutProfiles::Payway::PayoutProfileRequestCreator
56
+ end
57
+
58
+ def index
59
+ @search = Spree::PayoutProfile.ransack(params[:q])
60
+ @payout_profiles = @search.result.page(page).per(per_page).order(default: :desc)
61
+ end
62
+
63
+ # override
64
+ def location_after_save
65
+ edit_object_url(@object)
66
+ end
67
+
68
+ # override
69
+ # permit all attributes for now.
70
+ def permitted_resource_params
71
+ key = ActiveModel::Naming.param_key(@object)
72
+ permit_keys = params.require(key).keys
73
+
74
+ params.require(key).permit(permit_keys)
75
+ end
76
+
77
+ # override
78
+ def model_class
79
+ Spree::PayoutProfile
80
+ end
81
+
82
+ def page
83
+ params[:page] || 1
84
+ end
85
+
86
+ def per_page
87
+ params[:per_page] || 12
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Admin
3
+ class PayoutsController < Spree::Admin::ResourceController
4
+ belongs_to 'spree/order', find_by: :number
5
+
6
+ skip_before_action :load_resource
7
+
8
+ def index
9
+ @payouts = parent.payouts
10
+ .order(:created_at)
11
+ .where(state: params[:state] || 'confirmed')
12
+ .includes(:payoutable, :payout_profile, payment: :order)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,84 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ module CheckoutControllerDecorator
6
+ def self.prepended(base)
7
+ base.skip_before_action :ensure_order, only: [:request_update_payment]
8
+ end
9
+
10
+ # override
11
+ def create_payment_service
12
+ Vpago::Payments::FindOrCreate
13
+ end
14
+
15
+ # This API are deprecated
16
+ # :order_token, :payment_number
17
+ def request_update_payment
18
+ # this action is mostly called after order is completed.
19
+ # spree_current_order will be nil in this case, so we need to manual find.
20
+ order = find_order_by_token(params[:order_token])
21
+
22
+ if order.paid?
23
+ render_serialized_payload { serialize_resource(order) }
24
+ else
25
+ payment = find_payment(order, params[:payment_number])
26
+ context = payment.request_update
27
+
28
+ if context.success? && context.error_message.blank?
29
+ render_serialized_payload { serialize_resource(order) }
30
+ else
31
+ render_error_payload(context.error_message)
32
+ end
33
+ end
34
+ end
35
+
36
+ # This API are deprecated
37
+ def payment_redirect
38
+ payments = spree_current_order.payments
39
+ raise ActiveRecord::RecordNotFound if payments.blank?
40
+
41
+ last_payment = payments.last
42
+ payment_redirect = ::Vpago::PaymentRedirectHandler.new(
43
+ payment: last_payment,
44
+ override_return_deeplink_url: params[:override_return_deeplink_url]
45
+ ).process
46
+
47
+ if payment_redirect.error_message.blank?
48
+ render_serialized_payload do
49
+ payment_redirect_serializer.new(payment_redirect, params: serializer_params).serializable_hash
50
+ end
51
+ else
52
+ render_error_payload(payment_redirect.error_message)
53
+ end
54
+ end
55
+
56
+ def payment_redirect_serializer
57
+ Spree::V2::Storefront::PaymentRedirectSerializer
58
+ end
59
+
60
+ private
61
+
62
+ def find_payment(order, payment_number)
63
+ payment = order.payments.find_by(number: payment_number)
64
+
65
+ raise ActiveRecord::RecordNotFound if payment.nil?
66
+
67
+ payment
68
+ end
69
+
70
+ def find_order_by_token(token)
71
+ order = Spree::Order.find_by(token: token)
72
+
73
+ raise ActiveRecord::RecordNotFound if order.nil?
74
+ raise ActiveRecord::RecordNotFound if order.payments.blank?
75
+
76
+ order
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ Spree::Api::V2::Storefront::CheckoutController.prepend(Spree::Api::V2::Storefront::CheckoutControllerDecorator)
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ class PaywayCardPopupsController < ApplicationController
3
+ layout 'payway'
4
+ before_action :load_payment, only: [:show]
5
+
6
+ def show
7
+ if @payment.present?
8
+ options = {
9
+ app_checkout: true
10
+ }
11
+
12
+ @client_redirect = ::Vpago::Payway::Checkout.new(@payment, options)
13
+ end
14
+ end
15
+
16
+ def load_payment
17
+ @payment = ::Spree::Payment.find_by(number: params[:payment_number])
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class PaywayResultsController < ApplicationController
3
+ layout 'payway'
4
+
5
+ ## GET
6
+ def success; end
7
+
8
+ ## GET
9
+ def failed; end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ class PaywayV2CardPopupsController < ApplicationController
3
+ layout 'payway_v2'
4
+ before_action :load_payment, only: [:show]
5
+
6
+ def show
7
+ if @payment.present?
8
+ options = {
9
+ app_checkout: true
10
+ }
11
+
12
+ @client_redirect = ::Vpago::PaywayV2::Checkout.new(@payment, options)
13
+ end
14
+ end
15
+
16
+ def load_payment
17
+ @payment = ::Spree::Payment.find_by(number: params[:payment_number])
18
+ end
19
+ end
20
+ end