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
@@ -0,0 +1,2 @@
1
+ <%= render 'spree/checkout/payment/payway_root', payway_gateways: payway_gateways %>
2
+ <%= render 'spree/checkout/payment/payway_script', payway_gateway: payway_gateways.first, order: order %>
@@ -0,0 +1,9 @@
1
+ <% if payway_gateways.length > 0 %>
2
+ <!-- Root is should be only once in the payment action -->
3
+ <div id="aba_main_modal" class="aba-modal" data-payway-payment-method="<%=payway_gateways.map(&:id).to_json%>">
4
+ <!- Modal content —>
5
+ <div class="aba-modal-content" id="payway-form-wrapper" data-hook="payway-form" >
6
+ <%# get the form after the button is click %>
7
+ </div>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,77 @@
1
+ <% content_for :head do %>
2
+
3
+ <!-- Payway script load -->
4
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
5
+ <link rel="stylesheet" href="<%=payway_gateway.preferences[:host]%>/checkout-popup.html?file=css"/>
6
+ <script src="<%=payway_gateway.preferences[:host]%>/checkout-popup.html?file=js"></script>
7
+
8
+ <script>
9
+
10
+ function fetchABAForm(data){
11
+ var url = "<%=spree.update_checkout_path(order.state)%>"
12
+ var csrfToken = $('meta[name=csrf-token]').attr('content');
13
+
14
+ $.ajax({
15
+ url: url,
16
+ type: 'PATCH',
17
+ headers: {
18
+ 'X-CSRF-Token': csrfToken
19
+ },
20
+ data: data,
21
+ success: function(responseText){
22
+ handleResponseForm(responseText)
23
+ },
24
+ error: function(response, status) {
25
+ alert('<%=t('common.payment_request_failed_with')%>' + response.responseText)
26
+ }
27
+ });
28
+ }
29
+
30
+ function handleResponseForm(form){
31
+
32
+ var $paywayContainer = $("#payway-form-wrapper")
33
+ $paywayContainer.html(form)
34
+
35
+ setTimeout(function(){
36
+ AbaPayway.checkout()
37
+ }, 300);
38
+
39
+ }
40
+
41
+ document.addEventListener("turbolinks:load", function() {
42
+
43
+ $("#checkout_form_payment").on('submit', function(e) {
44
+
45
+ var paywayIds = $("#aba_main_modal").data("paywayPaymentMethod")
46
+ var $paymentChecked = $("input[name='order[payments_attributes][][payment_method_id]']:checked")
47
+
48
+ // ignore aba when apply_store_credit is clicked, spree wrap container with checkout form.
49
+ if (e.originalEvent.submitter.name == 'apply_store_credit')
50
+ return;
51
+
52
+ // no payment is checked
53
+ if($paymentChecked.length == 0)
54
+ return;
55
+
56
+ var paymentMethodId = parseInt($paymentChecked.val())
57
+
58
+ // if not payway is selected
59
+ if(paywayIds.indexOf(paymentMethodId) == -1)
60
+ return;
61
+
62
+
63
+ // create payway payment and render back the form
64
+ var $form = $(this)
65
+ var data = $form.serialize()
66
+ fetchABAForm(data)
67
+
68
+ // prevent form sumission / redirect by others.
69
+ e.preventDefault();
70
+ return false
71
+
72
+ })
73
+
74
+ })
75
+ </script>
76
+ <!-- End payway script load -->
77
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= hidden_field_tag "payment_source[#{payment_method.id}][payment_option]", Vpago::Payway::CARD_TYPE_ABAPAY %>
@@ -0,0 +1,2 @@
1
+ <%= render 'spree/checkout/payment/payway_v2_root', payway_v2_gateways: payway_v2_gateways %>
2
+ <%= render 'spree/checkout/payment/payway_v2_script', payway_v2_gateways: payway_v2_gateways.first, order: order %>
@@ -0,0 +1,9 @@
1
+ <% if payway_v2_gateways.length > 0 %>
2
+ <!-- Root is should be only once in the payment action -->
3
+ <div id="aba_v2_main_modal" class="aba-modal" data-payway-payment-method="<%=payway_v2_gateways.map(&:id).to_json%>">
4
+ <!- Modal content —>
5
+ <div class="aba-modal-content" id="payway-v2-form-wrapper" data-hook="payway-form" >
6
+ <%# get the form after the button is click %>
7
+ </div>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,79 @@
1
+ <% content_for :head do %>
2
+
3
+ <!-- Payway script load -->
4
+ <script src="https://checkout.payway.com.kh/plugins/checkout2-0.js"></script>
5
+
6
+ <script>
7
+ function fetchABAForm(data){
8
+ var url = "<%=spree.update_checkout_path(order.state)%>"
9
+ var csrfToken = $('meta[name=csrf-token]').attr('content');
10
+
11
+ $.ajax({
12
+ url: url,
13
+ type: 'PATCH',
14
+ headers: {
15
+ 'X-CSRF-Token': csrfToken
16
+ },
17
+ data: data,
18
+ success: function(responseText){
19
+ handleResponseForm(responseText)
20
+ },
21
+ error: function(response, status) {
22
+ alert('<%=t('common.payment_request_failed_with')%>' + response.responseText)
23
+ }
24
+ });
25
+ }
26
+
27
+ function handleResponseForm(form){
28
+ // in mobile responsive payway doesn't provide any callback when user close the payment pop up
29
+ // in spree checkout controller they check order state lock verions to verify if the order is able to update or not
30
+ // we have to update order state lock version manually to in order to be able to update the order
31
+ var prevLockVersion = parseInt($("#order_state_lock_version").val())
32
+ $("#order_state_lock_version").val(prevLockVersion + 1)
33
+
34
+ var $paywayContainer = $("#payway-v2-form-wrapper")
35
+ $paywayContainer.html(form)
36
+
37
+ setTimeout(function(){
38
+ AbaPayway.checkout()
39
+ }, 300);
40
+
41
+ }
42
+
43
+ document.addEventListener("turbolinks:load", function() {
44
+
45
+ $("#checkout_form_payment").on('submit', function(e) {
46
+
47
+ var paywayIds = $("#aba_v2_main_modal").data("paywayPaymentMethod")
48
+ var $paymentChecked = $("input[name='order[payments_attributes][][payment_method_id]']:checked")
49
+
50
+ // ignore aba when apply_store_credit is clicked, spree wrap container with checkout form.
51
+ if (e.originalEvent.submitter.name == 'apply_store_credit')
52
+ return;
53
+
54
+ // no payment is checked
55
+ if($paymentChecked.length == 0)
56
+ return;
57
+
58
+ var paymentMethodId = parseInt($paymentChecked.val())
59
+
60
+ // if not payway is selected
61
+ if(paywayIds.indexOf(paymentMethodId) == -1)
62
+ return;
63
+
64
+
65
+ // create payway payment and render back the form
66
+ var $form = $(this)
67
+ var data = $form.serialize()
68
+ fetchABAForm(data)
69
+
70
+ // prevent form sumission / redirect by others.
71
+ e.preventDefault();
72
+ return false
73
+
74
+ })
75
+
76
+ })
77
+ </script>
78
+ <!-- End payway script load -->
79
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <h3>
2
+ You are now being transferred to Wing Payment with secure SSL connection
3
+ </h3>
4
+
5
+ <form method="POST" style='display:none;' id="wingsdk_checkout_form" action="<%=action_url%>">
6
+ <% gateway_params.each do |key, value| %>
7
+ <div style='padding: 5px;' class="clearfix;">
8
+ <%=label_tag key, key, style: 'float: left; width: 100px;' %>
9
+ <%= text_field_tag key, value, size: 120, style: 'margin-left: 110px;' %>
10
+ </div>
11
+ <% end %>
12
+ <button type="submit" id='wingsdk_btn'> Submit </button>
13
+ </form>
14
+
15
+ <script>
16
+ if(document.getElementById("wingsdk_checkout_form"))
17
+ document.getElementById("wingsdk_checkout_form").submit()
18
+ </script>
@@ -0,0 +1 @@
1
+ <%= hidden_field_tag "payment_source[#{payment_method.id}][payment_option]", payment_method.method_type %>
@@ -0,0 +1,3 @@
1
+ <% if @client_redirect.present? && !@client_redirect.failed? %>
2
+ <%= render 'spree/checkout/payment/acleda_checkout_form', gateway_params: @client_redirect.gateway_params, action_url: @client_redirect.action_url %>
3
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <!-- return back when user choose payway getway and click on the continue button -->
2
+ <form method="POST" target="aba_webservice" action="<%=@client_redirect.action_url%>" id="aba_merchant_request">
3
+ <% @client_redirect.gateway_params.each do |key, value| %>
4
+ <div style='padding: 5px;' class="clearfix;">
5
+ <%=label_tag key, key, style: 'float: left; width: 100px;' %>
6
+ <%= text_field_tag key, value, size: 120, style: 'margin-left: 110px;' %>
7
+ </div>
8
+ <% end %>
9
+ <button type="submit" id='aba_btn'> Submit </button>
10
+ </form>
@@ -0,0 +1,10 @@
1
+ <!-- return back when user choose payway getway and click on the continue button -->
2
+ <form method="POST" style='display:none;' target="aba_webservice" action="<%=@client_redirect.checkout_url%>" id="aba_merchant_request">
3
+ <% @client_redirect.gateway_params.each do |key, value| %>
4
+ <div style='padding: 5px;' class="clearfix;">
5
+ <%=label_tag key, key, style: 'float: left; width: 100px;' %>
6
+ <%= text_field_tag key, value, size: 120, style: 'margin-left: 110px;' %>
7
+ </div>
8
+ <% end %>
9
+ <button type="submit" id='aba_btn'> Submit </button>
10
+ </form>
@@ -0,0 +1,3 @@
1
+ <% if @client_redirect.present? %>
2
+ <%= render 'spree/checkout/payment/wing_checkout_form', gateway_params: @client_redirect.gateway_params, action_url: @client_redirect.action_url %>
3
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <!-- return back when user choose payway getway and click on the continue button -->
2
+ <form method="POST" target="aba_webservice" action="<%=@client_redirect.action_url%>" id="aba_merchant_request">
3
+ <% @client_redirect.gateway_params.each do |key, value| %>
4
+ <div style='padding: 5px;' class="clearfix;">
5
+ <%=label_tag key, key, style: 'float: left; width: 100px;' %>
6
+ <%= text_field_tag key, value, size: 120, style: 'margin-left: 110px;' %>
7
+ </div>
8
+ <% end %>
9
+ <button type="submit" id='aba_btn'> Submit </button>
10
+ </form>
@@ -0,0 +1,5 @@
1
+ <% if @payment.present? %>
2
+ <%= render 'spree/checkout/payment/payway_loader', payway_gateways: [@payment.payment_method], order: @payment.order %>
3
+
4
+ <%= render 'form' if @client_redirect.present? %>
5
+ <% end %>
@@ -0,0 +1 @@
1
+ <p>failed</p>
@@ -0,0 +1 @@
1
+ <p>success</p>
@@ -0,0 +1,15 @@
1
+ <!-- return back when user choose payway getway and click on the continue button -->
2
+ <form method="POST" style='display:none;' action="<%= @client_redirect.checkout_url %>" id="aba_merchant_request">
3
+ <% @client_redirect.gateway_params.each do |key, value| %>
4
+ <div style='padding: 5px;' class="clearfix;">
5
+ <%=label_tag key, key, style: 'float: left; width: 100px;' %>
6
+ <%= text_field_tag key, value, size: 120, style: 'margin-left: 110px;' %>
7
+ </div>
8
+ <% end %>
9
+ <button type="submit" id='aba_btn'> Submit </button>
10
+ </form>
11
+
12
+ <script>
13
+ if(document.getElementById("aba_merchant_request"))
14
+ document.getElementById("aba_merchant_request").submit()
15
+ </script>
@@ -0,0 +1,3 @@
1
+ <% if @payment.present? %>
2
+ <%= render 'form' if @client_redirect.present? %>
3
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <h1>Checkout...</h1>
2
+
3
+ <%= render_form %>
@@ -0,0 +1,13 @@
1
+ <% @checkout = ::Vpago::PaywayV2::Checkout.new(@payment) %>
2
+
3
+ <form method="POST" action="<%= @checkout.checkout_url %>" id="aba_merchant_request">
4
+ <% @checkout.gateway_params.each do |key, value| %>
5
+ <input type='hidden' name='<%= key %>' value='<%= value %>' />
6
+ <% end %>
7
+ </form>
8
+
9
+ <script>
10
+ document.addEventListener("DOMContentLoaded", function () {
11
+ document.getElementById("aba_merchant_request").submit()
12
+ })
13
+ </script>
@@ -0,0 +1,49 @@
1
+ <h1 id="status">THIS IS CURRENT STATE</h1>
2
+ <p id="message"></p>
3
+
4
+ <script>
5
+ document.addEventListener("DOMContentLoaded", function() {
6
+ let firebaseConfigs = <%= Rails.application.credentials.firebase_web_config.to_json.html_safe %>;
7
+ let orderNumber = "<%= @order.number %>";
8
+
9
+ window.listenToProcessingState({
10
+ firebaseConfigs: firebaseConfigs,
11
+ orderNumber: orderNumber,
12
+ onPaymentIsProcessing: function (orderState, paymentState, logMessage) {
13
+ document.getElementById("status").innerText = "Payment is processing";
14
+ document.getElementById("message").innerText = logMessage;
15
+ },
16
+ onOrderIsProcessing: function (orderState, paymentState, logMessage) {
17
+ document.getElementById("status").innerText = "Order is processing";
18
+ document.getElementById("message").innerText = logMessage;
19
+ },
20
+ onOrderIsCompleted: function (orderState, paymentState, logMessage) {
21
+ document.getElementById("status").innerText = "Order is completed";
22
+ document.getElementById("message").innerText = logMessage;
23
+ },
24
+ onOrderProcessFailed: function (orderState, paymentState, logMessage) {
25
+ document.getElementById("status").innerText = "Order process failed";
26
+ document.getElementById("message").innerText = logMessage;
27
+ },
28
+ onPaymentIsRefunded: function (orderState, paymentState, logMessage) {
29
+ document.getElementById("status").innerText = "Payment is refunded";
30
+ document.getElementById("message").innerText = logMessage
31
+ },
32
+ onPaymentProcessFailed: function (orderState, paymentState, logMessage) {
33
+ document.getElementById("status").innerText = "Payment process failed";
34
+ document.getElementById("message").innerText = logMessage;
35
+ },
36
+ onCompleted: function (orderState, paymentState, logMessage) {
37
+ let successPath = "<%= @payment.success_url %>";
38
+ window.location.href = successPath;
39
+ },
40
+ });
41
+ });
42
+
43
+ window.requestProcessPayment({
44
+ url: "<%= @payment.process_payment_url %>",
45
+ params: <%= params.except(:action, :controller, :amp).to_json.html_safe %>,
46
+ maxRetries: 5,
47
+ retryDelayMs: 1000,
48
+ })
49
+ </script>
@@ -0,0 +1,3 @@
1
+ <h1>
2
+ Success
3
+ </h1>
@@ -0,0 +1,3 @@
1
+ <% if @client_redirect.present? %>
2
+ <%= render 'spree/checkout/payment/wing_checkout_form', gateway_params: @client_redirect.gateway_params, action_url: @client_redirect.action_url %>
3
+ <% end %>
data/bin/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" from the root of your extension
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/spree_vpago/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
data/build.js ADDED
@@ -0,0 +1,9 @@
1
+ const esbuild = require("esbuild");
2
+
3
+ esbuild.build({
4
+ entryPoints: ["app/javascripts/vpago/vpago_payments/user_informers/firebase.js"],
5
+ outfile: "app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js",
6
+ bundle: true,
7
+ minify: false,
8
+ globalName: "VpagoPayments",
9
+ }).catch(() => process.exit(1));
@@ -0,0 +1 @@
1
+ Rails.application.config.assets.precompile << 'spree_vpago_manifest.js'
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ module PermittedAttributes
3
+ @@source_attributes += %i[payment_option payment_id payment_method_id] # rubocop:disable Style/ClassVars
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ spree:
6
+ acleda_type: "Payment Type"
7
+ acleda_company_name: "Product Name in ACLEDA view"
8
+ acleda_payment_card: "Payment Card (only required for XPAY-MPGS)"
9
+ payment_process_failed: "Payment process failed"
10
+ insufficient_payment_amount_to_cover_the_total: "Payment amount is insufficient to cover the total"
11
+ qr_code: "QR code"
12
+ open_checkout: "Open Checkout"
13
+ vpago:
14
+ payments:
15
+ check_and_heal: "Auto correct"
16
+ manually_mark: "Update manually"
17
+ not_allow_for_order_completed: "Order completed. This action is not allowed"
18
+ checker_updated_by_description: "Transaction recheck"
19
+ force_updated_by_description: "Force paid"
20
+ updated_by_user: "Update by user"
21
+ updated_by_user_at: "Update by user at"
22
+ updated_reason: "Update with reason"
23
+ mark_with_reason: "Payment was marked to success with reason."
24
+ failed_require_updated_reason: "You must provide update reason"
25
+ payment_found_with_result: "Found payment with result: %{result}"
26
+ payment_not_found_with_error: "Payment not found with error: %{error}"
27
+ query_status: "Query payment status"
28
+ confirm_manual_update: "Are you sure to update this order to complete"
@@ -0,0 +1,24 @@
1
+ spree:
2
+ acleda_type: "Payment Type"
3
+ acleda_company_name: "Product Name in ACLEDA view"
4
+ acleda_payment_card: "Payment Card"
5
+ payment_process_failed: "Payment process failed"
6
+ insufficient_payment_amount_to_cover_the_total: "ចំនួនទឹកប្រាក់នៃការទូទាត់គឺមិនគ្រប់គ្រាន់"
7
+ qr_code: "QR code"
8
+ open_checkout: "Open Checkout"
9
+ vpago:
10
+ payments:
11
+ check_and_heal: "កែស្វ័យប្រវត្តិ"
12
+ manually_mark: "ធ្វើបច្ចុប្បន្នភាពដោយដៃ"
13
+ not_allow_for_order_completed: "ការបញ្ជាទិញបានបញ្ចប់។ សកម្មភាពនេះមិនត្រូវបានអនុញ្ញាតទេ"
14
+ checker_updated_by_description: "ពិនិត្យមើលប្រតិបត្តិការ"
15
+ force_updated_by_description: "ធ្វើបច្ចុប្បន្នភាពពេលបញ្ចប់"
16
+ updated_by_user: "ធ្វើបច្ចុប្បន្នភាពដោយអ្នកប្រើន"
17
+ updated_by_user_at: "ធ្វើបច្ចុប្បន្នភាពដោយអ្នកប្រើនៅ"
18
+ updated_reason: "ហេតុផល"
19
+ mark_with_reason: "ការទូទាត់ត្រូវបានសម្គាល់ដោយជោគជ័យដោយមានហេតុផល"
20
+ failed_require_updated_reason: "អ្នកត្រូវតែផ្តល់ហេតុផល"
21
+ payment_found_with_result: "រកឃើញការទូទាត់ជាមួយលទ្ធផល %{result}"
22
+ payment_not_found_with_error: "ការទូទាត់មិនត្រូវបានរកឃើញដោយកំហុស: %{error}"
23
+ query_status: "សួរស្ថានភាពបង់ប្រាក់"
24
+ confirm_manual_update: "តើអ្នកប្រាកដជាធ្វើបច្ចុប្បន្នភាពការបញ្ជាទិញនេះដើម្បីបញ្ចប់"
data/config/routes.rb ADDED
@@ -0,0 +1,92 @@
1
+ Spree::Core::Engine.add_routes do
2
+ # Add your extension routes here
3
+
4
+ resource :payway_card_popups, only: [:show]
5
+ resource :payway_v2_card_popups, only: [:show]
6
+ resource :wing_redirects, only: [:show]
7
+ resource :acleda_redirects, only: [:show]
8
+
9
+ resources :payway_results, only: [] do
10
+ collection do
11
+ get :success
12
+ get :failed
13
+ end
14
+ end
15
+
16
+ namespace :wing do
17
+ resources :transactions, only: [:show]
18
+ end
19
+
20
+ resource :vpago_payments do
21
+ collection do
22
+ get :checkout
23
+ get :processing
24
+ get :success
25
+
26
+ match :process_payment, via: %i[get post]
27
+ end
28
+ end
29
+
30
+ namespace :webhook do
31
+ resource :payways, only: [] do
32
+ match 'return', to: 'payways#return', via: %i[get post]
33
+ get 'continue', to: 'payways#continue'
34
+
35
+ match 'v2_return', to: 'payways#v2_return', via: %i[get post]
36
+ get 'v2_continue', to: 'payways#v2_continue'
37
+ end
38
+
39
+ resource :acledas, only: [] do
40
+ get 'success', to: 'acledas#success'
41
+ get 'error', to: 'acledas#error'
42
+ match 'return', to: 'acledas#return', via: :post
43
+ end
44
+
45
+ resource :acleda_mobiles, only: [] do
46
+ match 'return', to: 'acleda_mobiles#return', via: :post
47
+ end
48
+
49
+ resources :wings, only: [:create] do
50
+ match 'return', to: 'wings#return', via: %i[get post]
51
+ end
52
+ end
53
+
54
+ namespace :api, defaults: { format: 'json' } do
55
+ namespace :v2 do
56
+ namespace :storefront do
57
+ resource :checkout, controller: :checkout do
58
+ get :payment_redirect
59
+ patch :request_update_payment
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ namespace :admin do
66
+ resources :payment_wing_sdk_queriers, only: [:show]
67
+ resources :payment_wing_sdk_checkers, only: [:update]
68
+ resources :payment_wing_sdk_markers, only: [:update]
69
+
70
+ resources :payment_payway_queriers, only: [:show]
71
+ resources :payment_payway_checkers
72
+ resources :payment_payway_markers
73
+
74
+ resources :products do
75
+ resources :payout_profile_products
76
+ end
77
+
78
+ resources :orders do
79
+ resources :payouts
80
+ end
81
+
82
+ resources :shipping_methods do
83
+ resources :payout_profile_shipping_methods
84
+ end
85
+
86
+ resources :payout_profiles do
87
+ member do
88
+ post :verify_with_bank
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSpreeVpagoPaymentSources < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :spree_vpago_payment_sources do |t|
4
+ t.integer :user_id
5
+ t.string :payment_option
6
+ t.integer :payment_method_id
7
+ t.string :transaction_id
8
+ t.string :payment_status
9
+ t.string :payment_description
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ class AddFieldsToPaymentSources < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :spree_vpago_payment_sources, :updated_by_user_id, :integer
4
+ add_column :spree_vpago_payment_sources, :updated_by_user_at, :datetime
5
+ add_column :spree_vpago_payment_sources, :updated_reason, :string
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddPreferenceToSpreeVpagoPaymentSource < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :spree_vpago_payment_sources, :preferences, :text
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ class CreateSpreePayoutProfiles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :spree_payout_profiles, if_not_exists: true do |t|
4
+ t.string :type
5
+ t.string :name
6
+ t.string :bank_account_number
7
+
8
+ t.boolean :active, default: false
9
+ t.boolean :default, default: false
10
+
11
+ t.text :preferences
12
+ t.jsonb :response_data, default: {}
13
+ t.references :vendor, foreign_key: { to_table: :spree_vendors }
14
+
15
+ t.timestamp :verified_at
16
+ t.timestamp :deleted_at
17
+ t.timestamps
18
+
19
+ t.index [:type, :bank_account_number, :vendor_id], name: :index_spree_payout_profiles_on_type_and_bank_and_vendor
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ class CreateSpreePayoutProfileProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :spree_payout_profile_products, if_not_exists: true do |t|
4
+ t.references :payout_profile, foreign_key: { to_table: :spree_payout_profiles }
5
+ t.references :product, foreign_key: { to_table: :spree_products }
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddOptionalSperePayoutProfileProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_payout_profile_products, :optional, :boolean, null: false, default: false, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ class CreateSpreePayouts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :spree_payouts, if_not_exists: true do |t|
4
+ t.references :payout_profile, foreign_key: { to_table: :spree_payout_profiles }
5
+ t.references :payoutable, polymorphic: true, index: true
6
+ t.references :payment, foreign_key: { to_table: :spree_payments }
7
+
8
+ t.integer :state, default: 0, null: false
9
+ t.boolean :default, default: false, null: false
10
+
11
+ t.decimal :outstanding_amount, precision: 10, scale: 2
12
+ t.decimal :amount, precision: 10, scale: 2, default: '0.0', null: false
13
+
14
+ if t.respond_to? :jsonb
15
+ t.jsonb :public_metadata
16
+ t.jsonb :private_metadata
17
+ else
18
+ t.json :public_metadata
19
+ t.json :private_metadata
20
+ end
21
+
22
+ t.timestamps
23
+ end
24
+ end
25
+ end