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.
- checksums.yaml +7 -0
- data/.env.example +3 -0
- data/.github/workflows/test_and_publish_gem.yml +96 -0
- data/.gitignore +24 -0
- data/.rspec +3 -0
- data/.rubocop.yml +56 -0
- data/.ruby-version +1 -0
- data/.tool-versions +1 -0
- data/.travis.yml +45 -0
- data/Appraisals +20 -0
- data/Gemfile +27 -0
- data/Gemfile.lock +656 -0
- data/LICENSE +26 -0
- data/README.md +151 -0
- data/Rakefile +21 -0
- data/app/.gitkeep +0 -0
- data/app/assets/config/spree_vpago_manifest.js +3 -0
- data/app/assets/images/backend-process.svg +3 -0
- data/app/assets/images/vpago/payway/abapay.png +0 -0
- data/app/assets/images/vpago/payway/cards.png +0 -0
- data/app/assets/javascripts/vpago/vpago_payments/request_process_payment.js +44 -0
- data/app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js +15802 -0
- data/app/controllers/.gitkeep +0 -0
- data/app/controllers/spree/acleda_redirects_controller.rb +22 -0
- data/app/controllers/spree/admin/payment_methods_controller_decorator.rb +65 -0
- data/app/controllers/spree/admin/payment_payway_base_controller.rb +25 -0
- data/app/controllers/spree/admin/payment_payway_checkers_controller.rb +34 -0
- data/app/controllers/spree/admin/payment_payway_markers_controller.rb +44 -0
- data/app/controllers/spree/admin/payment_payway_queriers_controller.rb +39 -0
- data/app/controllers/spree/admin/payment_wing_sdk_base_controller.rb +21 -0
- data/app/controllers/spree/admin/payment_wing_sdk_checkers_controller.rb +26 -0
- data/app/controllers/spree/admin/payment_wing_sdk_markers_controller.rb +36 -0
- data/app/controllers/spree/admin/payment_wing_sdk_queriers_controller.rb +20 -0
- data/app/controllers/spree/admin/payments_controller_decorator.rb +19 -0
- data/app/controllers/spree/admin/payout_profile_products_controller.rb +21 -0
- data/app/controllers/spree/admin/payout_profile_shipping_methods_controller.rb +21 -0
- data/app/controllers/spree/admin/payout_profiles_controller.rb +91 -0
- data/app/controllers/spree/admin/payouts_controller.rb +16 -0
- data/app/controllers/spree/api/v2/storefront/checkout_controller_decorator.rb +84 -0
- data/app/controllers/spree/payway_card_popups_controller.rb +20 -0
- data/app/controllers/spree/payway_results_controller.rb +11 -0
- data/app/controllers/spree/payway_v2_card_popups_controller.rb +20 -0
- data/app/controllers/spree/vpago_payments_controller.rb +71 -0
- data/app/controllers/spree/webhook/acleda_mobiles_controller.rb +88 -0
- data/app/controllers/spree/webhook/acledas_controller.rb +80 -0
- data/app/controllers/spree/webhook/base_controller.rb +6 -0
- data/app/controllers/spree/webhook/payways_controller.rb +77 -0
- data/app/controllers/spree/webhook/wings_controller.rb +63 -0
- data/app/controllers/spree/wing/base_controller.rb +29 -0
- data/app/controllers/spree/wing/transactions_controller.rb +27 -0
- data/app/controllers/spree/wing_redirects_controller.rb +20 -0
- data/app/helpers/vpago/admin/base_helper_decorator.rb +40 -0
- data/app/helpers/vpago/vpago_payments_helper.rb +12 -0
- data/app/javascripts/vpago/vpago_payments/user_informers/firebase.js +62 -0
- data/app/jobs/application_unique_job.rb +1 -0
- data/app/jobs/vpago/payment_processor_job.rb +8 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/concerns/vpago/payoutable.rb +11 -0
- data/app/models/spree/gateway/acleda.rb +63 -0
- data/app/models/spree/gateway/acleda_mobile.rb +46 -0
- data/app/models/spree/gateway/payway.rb +66 -0
- data/app/models/spree/gateway/payway_v2.rb +174 -0
- data/app/models/spree/gateway/wing_sdk.rb +51 -0
- data/app/models/spree/payout.rb +23 -0
- data/app/models/spree/payout_profile.rb +107 -0
- data/app/models/spree/payout_profile_product.rb +14 -0
- data/app/models/spree/payout_profile_shipping_method.rb +14 -0
- data/app/models/spree/payout_profiles/payway_v2.rb +40 -0
- data/app/models/spree/vpago_payment_source.rb +21 -0
- data/app/models/vpago/adjustment_decorator.rb +28 -0
- data/app/models/vpago/line_item_decorator.rb +75 -0
- data/app/models/vpago/order_decorator.rb +78 -0
- data/app/models/vpago/payment_decorator.rb +44 -0
- data/app/models/vpago/payment_method_decorator.rb +91 -0
- data/app/models/vpago/payouts_generator.rb +125 -0
- data/app/models/vpago/product_decorator.rb +30 -0
- data/app/models/vpago/promotion_action_decorator.rb +9 -0
- data/app/models/vpago/shipment_decorator.rb +23 -0
- data/app/models/vpago/shipping_method_decorator.rb +33 -0
- data/app/models/vpago/shipping_rate_decorator.rb +25 -0
- data/app/models/vpago/store_decorator.rb +17 -0
- data/app/models/vpago/tax_category_decorator.rb +9 -0
- data/app/models/vpago/variant_decorator.rb +22 -0
- data/app/models/vpago/vendor_decorator.rb +10 -0
- data/app/overrides/spree/admin/adjustments/_adjustment/handle_by_table_body.html.erb.deface +11 -0
- data/app/overrides/spree/admin/adjustments/_adjustments_table/handle_by_table_header.html.erb.deface +3 -0
- data/app/overrides/spree/admin/adjustments/_form/handle_by_field.html.erb.deface +10 -0
- data/app/overrides/spree/admin/orders/_shipment/edit_method.html.erb.deface +26 -0
- data/app/overrides/spree/admin/orders/_shipment/show_method.html.erb.deface +27 -0
- data/app/overrides/spree/admin/payment_methods/_form/enable_pre_auth_field.html.erb.deface +17 -0
- data/app/overrides/spree/admin/payment_methods/_form/vendor_field.html.erb.deface +6 -0
- data/app/overrides/spree/admin/payment_methods/index/list.html.erb.deface +45 -0
- data/app/overrides/spree/admin/payment_methods/index/payment_methods_tabs.html.erb.deface +9 -0
- data/app/overrides/spree/admin/payment_methods/index/vendor_body.html.erb.deface +5 -0
- data/app/overrides/spree/admin/payment_methods/index/vendor_header.html.erb.deface +5 -0
- data/app/overrides/spree/admin/payments/_list/actions.html.erb.deface +13 -0
- data/app/overrides/spree/admin/promotions/_promotion_action/run_by_field.html.erb.deface +13 -0
- data/app/overrides/spree/admin/shared/_order_tabs/payouts.html.erb.deface +8 -0
- data/app/overrides/spree/admin/shared/_product_tabs/payout_profile_products.html.erb.deface +8 -0
- data/app/overrides/spree/admin/shared/sub_menu/_integrations/payout_profiles.html.erb.deface +3 -0
- data/app/overrides/spree/admin/shipping_methods/_form/handle_by.html.erb.deface +12 -0
- data/app/overrides/spree/admin/shipping_methods/edit/shipping_method_tabs.html.erb.deface +3 -0
- data/app/overrides/spree/admin/tax_categories/_form/collect_by_field.html.erb.deface +10 -0
- data/app/overrides/spree/admin/tax_categories/index/collect_by_table_body.html.erb.deface +4 -0
- data/app/overrides/spree/admin/tax_categories/index/collect_by_table_header.html.erb.deface +4 -0
- data/app/serializers/spree/api/v2/platform/vpago_payment_source_serializer.rb +11 -0
- data/app/serializers/spree/v2/storefront/payment_method_serializer_decorator.rb +23 -0
- data/app/serializers/spree/v2/storefront/payment_redirect_serializer.rb +13 -0
- data/app/serializers/spree/v2/storefront/payment_serializer_decorator.rb +13 -0
- data/app/serializers/spree/v2/storefront/vpago_payment_source_serializer.rb +9 -0
- data/app/services/.gitkeep +0 -0
- data/app/services/vpago/payment_finder.rb +27 -0
- data/app/services/vpago/payment_processor.rb +72 -0
- data/app/services/vpago/payment_redirect_handler.rb +194 -0
- data/app/services/vpago/payment_url_constructor.rb +32 -0
- data/app/services/vpago/payments/find_or_create.rb +51 -0
- data/app/services/vpago/payout_profiles/payway/base_payout_profile_request.rb +38 -0
- data/app/services/vpago/payout_profiles/payway/open_ssl_encrypter.rb +31 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_creator.rb +50 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_params_builder.rb +58 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_updater.rb +28 -0
- data/app/services/vpago/payway_return_options_builder.rb +39 -0
- data/app/services/vpago/user_informers/firebase.rb +52 -0
- data/app/views/.gitkeep +0 -0
- data/app/views/layouts/acleda.html.erb +18 -0
- data/app/views/layouts/payway.html.erb +24 -0
- data/app/views/layouts/payway_v2.html.erb +18 -0
- data/app/views/layouts/vpago_payments.html.erb +18 -0
- data/app/views/layouts/wing.html.erb +18 -0
- data/app/views/spree/_payment_icon.html.erb +25 -0
- data/app/views/spree/acleda_redirects/show.html.erb +3 -0
- data/app/views/spree/admin/payments/source_forms/_payment_payway.html.erb +4 -0
- data/app/views/spree/admin/payments/source_forms/_payway_v2.html.erb +7 -0
- data/app/views/spree/admin/payments/source_views/_acleda.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_acleda_mobile.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_payment_payway.html.erb +98 -0
- data/app/views/spree/admin/payments/source_views/_payway_v2.html.erb +5 -0
- data/app/views/spree/admin/payments/source_views/_vpago_payment_tmpl.html.erb +113 -0
- data/app/views/spree/admin/payments/source_views/_wingsdk.html.erb +5 -0
- data/app/views/spree/admin/payout_profile_products/_form.html.erb +28 -0
- data/app/views/spree/admin/payout_profile_products/edit.html.erb +18 -0
- data/app/views/spree/admin/payout_profile_products/index.html.erb +58 -0
- data/app/views/spree/admin/payout_profile_products/new.html.erb +22 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/_form.html.erb +28 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/edit.html.erb +22 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/index.html.erb +6 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/new.html.erb +27 -0
- data/app/views/spree/admin/payout_profiles/_filter.html.erb +19 -0
- data/app/views/spree/admin/payout_profiles/_form.html.erb +72 -0
- data/app/views/spree/admin/payout_profiles/edit.html.erb +33 -0
- data/app/views/spree/admin/payout_profiles/index.html.erb +63 -0
- data/app/views/spree/admin/payout_profiles/new.html.erb +13 -0
- data/app/views/spree/admin/payouts/_line_item_info_with_popover.html.erb +43 -0
- data/app/views/spree/admin/payouts/index.html.erb +46 -0
- data/app/views/spree/admin/shared/_payment_methods_tabs.html.erb +15 -0
- data/app/views/spree/admin/shared/_shipping_method_tabs.html.erb +19 -0
- data/app/views/spree/admin/shared/payout_profile/_info_card.html.erb +24 -0
- data/app/views/spree/admin/shared/payout_profile/_status.html.erb +11 -0
- data/app/views/spree/checkout/payment/_acleda.html.erb +1 -0
- data/app/views/spree/checkout/payment/_acleda_checkout_form.html.erb +14 -0
- data/app/views/spree/checkout/payment/_acleda_mobile.html.erb +0 -0
- data/app/views/spree/checkout/payment/_payment_payway.html.erb +21 -0
- data/app/views/spree/checkout/payment/_payway_loader.html.erb +2 -0
- data/app/views/spree/checkout/payment/_payway_root.html.erb +9 -0
- data/app/views/spree/checkout/payment/_payway_script.html.erb +77 -0
- data/app/views/spree/checkout/payment/_payway_v2.html.erb +1 -0
- data/app/views/spree/checkout/payment/_payway_v2_loader.html.erb +2 -0
- data/app/views/spree/checkout/payment/_payway_v2_root.html.erb +9 -0
- data/app/views/spree/checkout/payment/_payway_v2_script.html.erb +79 -0
- data/app/views/spree/checkout/payment/_wing_checkout_form.html.erb +18 -0
- data/app/views/spree/checkout/payment/_wingsdk.html.erb +1 -0
- data/app/views/spree/checkout/payment/acleda_form.html.erb +3 -0
- data/app/views/spree/checkout/payment/payway_form.html.erb +10 -0
- data/app/views/spree/checkout/payment/payway_v2_form.html.erb +10 -0
- data/app/views/spree/checkout/payment/wingsdk_form.html.erb +3 -0
- data/app/views/spree/payway_card_popups/_form.html.erb +10 -0
- data/app/views/spree/payway_card_popups/show.html.erb +5 -0
- data/app/views/spree/payway_results/failed.html.erb +1 -0
- data/app/views/spree/payway_results/success.html.erb +1 -0
- data/app/views/spree/payway_v2_card_popups/_form.html.erb +15 -0
- data/app/views/spree/payway_v2_card_popups/show.html.erb +3 -0
- data/app/views/spree/vpago_payments/checkout.html.erb +3 -0
- data/app/views/spree/vpago_payments/forms/spree/gateway/_payway_v2.html.erb +13 -0
- data/app/views/spree/vpago_payments/processing.html.erb +49 -0
- data/app/views/spree/vpago_payments/success.html.erb +3 -0
- data/app/views/spree/wing_redirects/show.html.erb +3 -0
- data/bin/rails +8 -0
- data/build.js +9 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/spree_permitted_attributes.rb +5 -0
- data/config/locales/en.yml +28 -0
- data/config/locales/km.yml +24 -0
- data/config/routes.rb +92 -0
- data/db/migrate/20210128040625_create_spree_vpago_payment_sources.rb +14 -0
- data/db/migrate/20210430052432_add_fields_to_payment_sources.rb +7 -0
- data/db/migrate/20210824044737_add_preference_to_spree_vpago_payment_source.rb +5 -0
- data/db/migrate/20240506095140_create_spree_payout_profiles.rb +22 -0
- data/db/migrate/20240506095148_create_spree_payout_profile_products.rb +10 -0
- data/db/migrate/20240523070757_add_optional_spere_payout_profile_products.rb +5 -0
- data/db/migrate/20240715091228_create_spree_payouts.rb +25 -0
- data/db/migrate/20240718195510_create_spree_payout_profile_shipping_methods.rb +15 -0
- data/db/migrate/20240718201453_add_handle_by_to_spree_adjustments.rb +5 -0
- data/db/migrate/20240718201509_add_run_by_to_spree_promotion_actions.rb +5 -0
- data/db/migrate/20240718201523_add_collect_by_to_spree_tax_categories.rb +5 -0
- data/db/migrate/20240718201538_add_handle_by_to_spree_shipping_method.rb +5 -0
- data/db/migrate/20240718201554_add_handle_by_to_spree_shipping_rates.rb +5 -0
- data/db/migrate/20240808102853_add_vendor_reference_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20240904030132_add_gateway_status_to_spree_payments.rb +5 -0
- data/db/migrate/20241029071959_add_pre_auth_response_to_spree_payment.rb +5 -0
- data/db/migrate/20241202104014_add_enable_pre_auth_to_spree_payment_method.rb +5 -0
- data/db/migrate/20250121044614_add_transaction_response_to_spree_payments.rb +5 -0
- data/docs/acleda.md +65 -0
- data/gemfiles/spree_3_7.gemfile +9 -0
- data/gemfiles/spree_4_0.gemfile +8 -0
- data/gemfiles/spree_4_1.gemfile +9 -0
- data/gemfiles/spree_master.gemfile +8 -0
- data/lib/generators/spree_vpago/install/install_generator.rb +26 -0
- data/lib/generators/spree_vpago/install/templates/app/assets/images/vpago/payway/acleda_merchant_logo_300x300.png +0 -0
- data/lib/spree_vpago/engine.rb +36 -0
- data/lib/spree_vpago/factories.rb +6 -0
- data/lib/spree_vpago/version.rb +9 -0
- data/lib/spree_vpago.rb +5 -0
- data/lib/vpago/acleda/base.rb +111 -0
- data/lib/vpago/acleda/checkout.rb +105 -0
- data/lib/vpago/acleda/deeplink_checkout.rb +74 -0
- data/lib/vpago/acleda/payment_request_updater.rb +38 -0
- data/lib/vpago/acleda/transaction_status.rb +71 -0
- data/lib/vpago/acleda_mobile/base.rb +28 -0
- data/lib/vpago/acleda_mobile/callback_validator.php +35 -0
- data/lib/vpago/acleda_mobile/callback_validator.rb +38 -0
- data/lib/vpago/acleda_mobile/checkout.rb +78 -0
- data/lib/vpago/acleda_mobile/payment_request_updater.rb +34 -0
- data/lib/vpago/acleda_mobile/payment_retriever.rb +24 -0
- data/lib/vpago/acleda_mobile/transaction_status.rb +35 -0
- data/lib/vpago/payment_amount_calculator.rb +23 -0
- data/lib/vpago/payment_request_updater.rb +19 -0
- data/lib/vpago/payment_status_marker.rb +109 -0
- data/lib/vpago/payway/base.rb +112 -0
- data/lib/vpago/payway/checkout.rb +24 -0
- data/lib/vpago/payway/payment_request_updater.rb +31 -0
- data/lib/vpago/payway/payment_status_marker.rb +84 -0
- data/lib/vpago/payway/transaction_status.rb +74 -0
- data/lib/vpago/payway.rb +13 -0
- data/lib/vpago/payway_v2/base.rb +153 -0
- data/lib/vpago/payway_v2/checkout.rb +35 -0
- data/lib/vpago/payway_v2/payment_request_updater.rb +65 -0
- data/lib/vpago/payway_v2/payouts_params_constructor.rb +47 -0
- data/lib/vpago/payway_v2/pre_auth_canceler.rb +43 -0
- data/lib/vpago/payway_v2/pre_auth_completer.rb +76 -0
- data/lib/vpago/payway_v2/transaction_status.rb +85 -0
- data/lib/vpago/wing_sdk/base.rb +58 -0
- data/lib/vpago/wing_sdk/checkout.rb +20 -0
- data/lib/vpago/wing_sdk/payment_request_updater.rb +46 -0
- data/lib/vpago/wing_sdk/payment_retriever.rb +34 -0
- data/lib/vpago/wing_sdk/transaction_status_checker.rb +64 -0
- data/lib/vpago/wing_sdk/transaction_status_response.rb +33 -0
- data/node_modules/.yarn-integrity +147 -0
- data/package-lock.json +1491 -0
- data/package.json +10 -0
- data/spree_vpago.gemspec +33 -0
- data/yarn.lock +921 -0
- metadata +403 -0
@@ -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,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,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,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 @@
|
|
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,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>
|
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,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,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,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
|